Fork me on GitHub

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

 

posted @ 2021-04-29 19:23  zerozhupan  阅读(196)  评论(0)    收藏  举报