ECMAScript 8 async 函数
ES8 正式将 async 函数记入 state-4 阶段
async 函数的声明
一般声明
async function fn() {}async 函数表达式
const fn = async function () {};async 方法
let obj = { async method() {} }async 箭头函数
const foo = async () => {};class 内部声明 async 函数
class A {
async method() {}
}async 函数总会返回 Promise 实例
async function asyncFunc() {
return 123;
}
asyncFunc().then(x => console.log(x)); // 123
async function asyncFunc() {
throw new Error('Problem!');
}
asyncFunc().catch(err => console.log(err)); // Error: Problem!通过 await 操作符处理异步计算
await操作符(只允许在 async 函数中)后面是一个 Promise 对象(如果不是,将立即转成resolved的 Promise ),await 会等待 Promise 从 pending 状态变更后,再继续往后执行。
如果 Promise 的状态是
resolved,awiat的结果就是 resolved value如果 Promise 的状态是
rejected,await将会抛出 rejection valuse
处理异常
对比 Promise.all()。await 是队列进行的,Promise.all()是并行进行的。
async 函数的执行过程
async 函数是同步开始,异步结束的
async 函数的结果永远是一个 Promise 对象
p,这个 Promise 在开始执行异步函数的时候创建async 函数体被执行。通过
return或throw返回最终的执行结果,又或者通过await返回临时结果;这些结果通常都是延迟返回的;返回 Promise
p。
当执行 async 函数体时,return x将会使 Promise p以resolved状态返回 x,throw err将会使 Promise p以rejected状态返回 err。执行结果的通知是异步发生的。换句话说,then()和catch()总是在当前代码执行结束之后再执行。
分析上述代码:
Line(A): 同步调用 async 函数,async 函数的 promise 通过 return 变成 resolved 状态
Line(C): 继续执行
Line(B): 异步通知 Promise 状态变更
最后更新于