Async +Await
async 是“异步”的简写,async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成,await 只能出现在 async 函数中
async 的作用
async 函数负责返回一个 Promise 对象
如果在async函数中 return 一个直接量,async 会把这个直接量通过Promise.resolve() 封装成 Promise 对象;
如果 async 函数没有返回值,它会返回 Promise.resolve(undefined)
1 | async function asyncTest0(){} |
await 在等待什么
一般我们都用await去等一个async函数完成,不过按语法说明,await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值,所以,await后面实际可以接收普通函数调用或者直接量
如果await等到的不是一个promise对象,那跟着的表达式的运算结果就是它等到的东西;
如果是一个promise对象,await会阻塞后面的代码,等promise对象resolve,得到resolve的值作为await表达式的运算结果
虽然await阻塞了,但await在async中,async不会阻塞,它内部所有的阻塞都被封装在一个promise对象中异步执行
1 | let a=0 |
上面的🌰中, async函数asyncTest1被封装成在一个promise对象异步执行, 所以先输出同步执行的1 :a=0, 此时a++还没执行估a为0. 执行asyncTest1函数, await会阻塞后面的代码, 所以输出0: a=1时, a++已经执行完了.
循环
🌰:
模拟异步:
1 | // 模拟异步 |
使用forEach并行:
1 | async function test0() { |
使用for循环串行:
1 | async function test1() { |
多个请求并发执行:
可用Promise.all
1 | var num = 0 |
或者
1 | var num = 0 |
异常处理
异常
async 函数返回的是一个promise对象, 估可以直接使用.catch捕获异常
1 | async function f() { |
或者:
await会等待执行结束, 所以代码其实相当于一个同步的过程, 可以直接采用try…catch捕获
1 | async function f() { |
注意: 第二个 await没有执行(—没有打印), 也就证明, async遇到异常就会中断链