async和await
一、async
一个函数前面加上async,则会返回一个promise。
1 async function test() { 2 return "1"; 3 } 4 console.log(test());
// 打印:Promise { '1' }
可以把 async 看成将函数返回值使用 Promise.resolve() 包裹了下。
二、await
await 一般和async配合使用。函数前必须加一个 async,异步操作方法前加一个 await 关键字,意思就是等一下,执行完了再继续走,注意:await 只能在 async 函数中运行,否则会报错。
1. await后面跟promise:
function sleep() { return new Promise(resolve => { console.log("执行了promise里的打印"); setTimeout(() => { resolve("我是定时器里的异步代码") }, 2000); }) } async function test() { let value = await sleep(); console.log(value); console.log("要等待await后面执行完才轮到我,尽管我是同步的"); } test(); // 输出: 执行了promise里的打印 我是定时器里的异步代码 要等待await后面执行完才轮到我,尽管我是同步的
async 和 await 相比直接使用 Promise 来说,优势在于处理 then 的调用链,能够更清晰准确的写出代码。缺点在于滥用 await 可能会导致性能问题,因为 await 会阻塞代码,也许之后的异步代码并不依赖于前者,但仍然需要等待前者完成,导致代码失去了并发性。
2. await后面跟正常的函数(非promise)
1 function sleep1() { 2 setTimeout(() => { 3 console.log("111"); 4 }, 2000); 5 } 6 7 function sleep2() { 8 setTimeout(() => { 9 console.log("222"); 10 }, 1000); 11 } 12 13 async function test() { 14 await sleep1(); 15 await sleep2(); 16 console.log("333"); 17 } 18 test(); 19 20 // 输出: 21 333 22 222 23 111

浙公网安备 33010602011771号