await 等到之后,做了一件什么事情?
两种情况
- 不是promise对象
- 是promise对象
如果不是 promise , await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为 await表达式的结果。
如果它等到的是一个 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为 await 表达式的运算结果。
// async function firstAsync () {
// return 27
// }
// console.log(firstAsync() instanceof Promise) // true
// firstAsync().then(val => {
// console.log(val) // 27
// })
//
async function firstAsync() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("now it is done");
}, 1000);
});
console.log(await promise);
console.log(await 0);
console.log(await Promise.resolve(1));
console.log(2);
return Promise.resolve(3);
}
firstAsync().then(val => {
console.log(val);
});
// now it is done
// 0
// 1
// 2
// 3
async await对比promise的优缺点
优点
- 它做到了真正的串行的同步写法,代码阅读相对容易
- 对于条件语句和其他流程语句比较友好,可以直接写到判断条件里面
-
缺点
无法处理 promise 返回的 reject 对象,要借助 try/catch
- 用 await 可能会导致性能问题,因为 await 会阻塞代码,也许之后的异步代码并不依赖于前者,但仍然需要等待前者完成,导致代码失去了并发性。
- try/catch 内部的变量无法传递给下一个 try/catch,Promise 和 then/catch 内部定义的变量,能通过 then 链条的参数传递到下一个 then/catch,但是 async/await 的 try 内部的变量,如果用 let 和 const 定义则无法传递到下一个 try/catch,只能在外层作用域先定义好。
但async/await确确实实是解决了promise一些问题的。更加灵活的处理异步