图解 Await 和 Async
文章目录
- 简介
- Promise
- 问题:组合 Promise
- Async 函数
- Await
- 错误处理
- 讨论
简介
Promises
var rp = require('request-promise');
const promise = rp('http://example.com/')
console.log('Starting Execution');
const promise = rp('http://example.com/'); // Line 3
promise.then(result => console.log(result)); // Line 4
console.log("Can't know if promise has finished yet...");

promise 的计算过程。呼叫“线程”不能等待 promise 。在 promise 之后调度代码的唯一方法是通过then方法指定回调函数。
rp('http://example.com/').
then(() => console.log('Success')).
catch(e => console.log(`Failed: ${e}`))
const success = Promise.resolve('Resolved');
// 将会显示 "Successful result: Resolved"
success.
then(result => console.log(`Successful result: ${result}`)).
catch(e => console.log(`Failed with: ${e}`))
const fail = Promise.reject('Err');
// 将会显示 "Failed with: Err"
fail.
then(result => console.log(`Successful result: ${result}`)).
catch(e => console.log(`Failed with: ${e}`))
组合 Promise
- 进行HTTP请求,等待完成,打印结果;
- 然后进行其他两个并行HTTP调用;
- 当它们都完成时,打印结果。 以下代码段演示了如何完成此操作:
//进行第一个调用
const call1Promise = rp('http://example.com/'); // Line 2 call1Promise.then(result1 => {
//在第一个请求完成后执行
console.log(result1); const call2Promise = rp('http://example.com/'); // Line 8
const call3Promise = rp('http://example.com/'); // Line 9 return Promise.all([call2Promise, call3Promise]); // Lin 11
}).then(arr => { // Line 12
//两个 promise 完成后执行
console.log(arr[0]);
console.log(arr[1]);
})

计算过程中的 Promise 组合。我们使用“Promise.all”将两个并发的 Promise组合成一个 Promise。
Async
function f() {
return Promise.resolve('TEST');
}
// asyncF相当于f!
async function asyncF() {
return 'TEST';
}
function f() {
return Promise.reject('Error');
}
// asyncF相当于f!
async function asyncF() {
throw 'Error';
}
Await
async function f() {
// 返回值将作为 promise 被处理(resolve)之后的结果
const response = await rp('http://example.com/');
console.log(response);
}
// 不能在 async 函数之外使用 await 关键字
// 需要使用 then 回调
f().then(() => console.log('Finished'));
// 将解决问题的方法封装到一个异步的函数中
async function solution() {
// 等待第一个 HTTP 调用并且打印出结果
console.log(await rp('http://example.com/')); // 生成 HTTP 调用但是不等待它们执行完毕 - 同时运行
const call2Promise = rp('http://example.com/'); // 不等待! // Line 7
const call3Promise = rp('http://example.com/'); // 不等待! // Line 8 //在它们都被调用之后 - 等待它们执行完毕
const response2 = await call2Promise; // Line 11
const response3 = await call3Promise; // Line 12 console.log(response2);
console.log(response3);
} // 调用 async 函数
solution().then(() => console.log('Finished'))
async function f() {
console.log('Starting F');
const result = await rp('http://example.com/');
console.log(result);
}

错误处理
async function f() {
try{
const promiseResult = await Promise.reject('Error');
} catch (e) {
console.log(e);
}
}
async function f() {
// 抛出异常
const promiseResult = await Promise.reject('Error');
}
// 将打印 "Error"
f().
then(() => console.log('Success')).
catch(err => console.log(err))
async function g() {
throw "Error";
}
// 将打印 “Error”
g().
then(() => console.log('Success')).
catch(err => console.log(err))
讨论
async function fAsync() {
// 事实上返回值是 Promise.resolve(5)
return 5;
}
// 不能调用 await fAsync(), 需要使用 then/catch
fAsync().then(r => console.log(`result is ${r}`));

图解 Await 和 Async的更多相关文章
- 小心C# 5.0 中的await and async模式造成的死锁
平时在使用C# 5.0中的await and async关键字的时候总是没注意,直到今天在调试一个ASP.NET项目时,发现在调用一个声明为async的方法后,程序老是莫名其妙的被卡住,就算声明为as ...
- await和async关键字来写异步程序
await和async关键字出现于.Net5.0,方便写异步程序. 例子: public class MyClass { public MyClass() { DisplayValue(); //这里 ...
- C#同步,异步的理解,包括5.0中await和async(学习笔记)
之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...
- 【笔记】记一次.net语法await和async的异步编程实验与笔记。
1.实践代码全记录: using System; using System.Collections.Generic; using System.Diagnostics; using System.Li ...
- await和async更多的理解
最近有不少网友提起await和async,呵呵,C# 5引进的语法糖. 这个语法糖还真不好吃,能绕倒一堆初学的朋友,在网上也有很多网友关于这块知识点的争论,有对有错,今天在这里把这个误区好好讲讲. 在 ...
- C#语法——await与async的正确打开方式
C#5.0推出了新语法,await与async,但相信大家还是很少使用它们.关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者 ...
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
C#语法——泛型的多种应用 本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...
- await和async在一般处理程序中的使用
写在前面 有个小项目,前端使用的html页面,那服务端的业务处理就采用最简单的一般处理程序了,之前一直在用,觉得一直用一种方式,确实挺蛋疼的,之前也有了解过async和await的内容.就想着自己折腾 ...
- C#异步编程のawait和async关键字来写异步程序
一.await和async关键字 .Net平台不断推出了新的异步编程模型,在.net4.5中加入了关键字await和async,顾名思义,await是指方法执行可等待,即可挂起直到有结果(不是必须立即 ...
随机推荐
- JavaScript基础-02
1. 六种数据类型: string字符串:number数值:boolean布尔值:null空值:undefined 未定义:object对象 基本数据类型(值类型): string字符串:number ...
- Spring Cloud Config Client 超时与重试
简介 有时客户端需要在 config server 无响应时进行重试,以给 config server 时间进行恢复.利用 spring 提供的重试组件,我们可以方便的配置重试机制,包括重试间隔,重试 ...
- Golang gRPC学习(04): Deadlines超时限制
为什么要使用Deadlines 当我们使用gRPC时,gRPC库关系的是连接,序列化,反序列化和超时执行.Deadlines 允许gRPC客户端设置自己等待多长时间来完成rpc操作,直到出现这个错误 ...
- 几种定时任务(Timer、TimerTask、ScheduledFuture)的退出—结合真实案例【JAVA】
工作中常常会有定时任务的开发需求,特别是移动端.最近笔者正好有所涉及,鉴于此,结合开发中的案例说明一下几种定时任务的退出. 需求说明:定时更新正在生成的文件大小和状态[进行中.失败.完成],如果文件生 ...
- SpringSecurity权限管理系统实战—三、主要页面及接口实现
系列目录 前言 后端五分钟,前端半小时.. 每次写js都头疼. 自己写前端是不可能的,这辈子不可能自己写前端的,只能找找别人的模板才能维持的了生存这样子.github,gitee上的模板又多,帮助文档 ...
- pytest封神之路第一步 tep介绍
『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』 tep前身 tep的前身是接口自动化测 ...
- java进阶(8)--匿名类
一.概念 1.内部类:类的内部定义了一个类 2.内部类分类:静态内部类.实例内部类.局部内部类 3.缺点:内部类的可读性比较差,尽量不用 2.匿名内部类:局部内部类的一种 二.匿名内部类的缺点 1 ...
- Quartz:基本用法总结
OpenSymphony所提供的Quartz是任务调度领域享誉盛名的开源框架.Spring提供了集成Quartz的功能,可以让开发人员以更面向Spring的方式创建基于Quartz的任务调度应用.任务 ...
- Robot Framework(7)——接口测试
一.准备工作 1.安装requests工具(2.22.0) 下载地址:https://pypi.org/project/requests/ 安装方式: 1>下载压缩文件,解压,目录切到解压目录, ...
- VyOS软路由系统基本设置
1. VyOS简介 VyOS是一个开源的网络操作系统,可以安装在物理硬件上,也可以安装在你自己的虚拟机上,或者是一个云平台上.它基于GNU/Linux,并加入了多个应用程序,如:Quagga, ISC ...