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一些问题的。更加灵活的处理异步
