美文网首页
ES2017 async 函数

ES2017 async 函数

作者: Lucien_d70a | 来源:发表于2018-02-23 15:39 被阅读0次

    async 和 await 在干什么

    • 每个名称都有意义
      • async : 异步
      • await: async wait简写 异步等待
    • 所以很好理解 async 是声明一个函数是异步的,而await是用于等待一个异步方法执完成。

    async 起什么作用

    async function testAsync() {
        return "hello async";
    }
    let result = testAsync()
    console.log(result) //Promise { 'hello async' }
    

    以上代码输出的是了一个Promise 对象

    • 如果在 async 函数中 return 一个直接量, async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。
    • 所以正确的输出方式应该是
    async function testAsync() {
        return "hello async";
    }
    testAsync().then(res => console.log(res)) //'hello async'
    
    • 如果async 函数没有返回值 它就会返回 Promise.resolve(undefined)

    await 到底在等啥

    • 按意思说 await 就是异步等待 等待着一个返回值,而实际上await 等待就是一个Promise对象 或者 是其它值。

    • 因为 async 返回的是一个Promise 对象,所以 await 等待就是 async 的返回值。

    • 但要清楚,它等的实际是一个返回值。注意到 await 不仅仅用于等 Promise 对象,它可以等任意表达式的结果,所以,await 后面实际是可以接普通函数调用或者直接量的。

    function getSomething() {
        return "something";
    }
    
    async function testAsync() {
        return Promise.resolve("hello async");
    }
    
    async function test() {
        const v1 = await getSomething();
        const v2 = await testAsync();
        console.log(v1, v2);
    }
    
    test() // something hello async
    

    所以以上代码是可以正确运行的

    相比之下 async 和 await 到底有什么优势

    • 看代码
    function takeLongTime(n) {
        return new Promise(resolve => {
            setTimeout(() => resolve(n + 200), n);
        });
    }
    
    function step1(n) {
        console.log(`step1 with ${n}`);
        return takeLongTime(n);
    }
    
    function step2(n) {
        console.log(`step2 with ${n}`);
        return takeLongTime(n);
    }
    
    function step3(n) {
        console.log(`step3 with ${n}`);
        return takeLongTime(n);
    }
    
    • 用Promise 输出
    function doIt() {
        console.time("doIt");
        const time1 = 300;
        step1(time1)
            .then(time2 => step2(time1))
            .then(time3 => step3(time1))
            .then(result => {
                console.log(`result is ${result}`);
                console.timeEnd("doIt");
            });
    }
    
    doIt();
    // step1 with 300
    // step2 with 500
    // step3 with 700
    // result is 900
    // doIt: 1507.251ms
    
    • 用async await
    async function doIt() {
        console.time("doIt");
        const time1 = 300;
        const time2 = await step1(time1);
        const time3 = await step2(time1);
        const result = await step3(time1);
        console.log(`result is ${result}`);
        console.timeEnd("doIt");
    }
    doIt();
    // step1 with 300
    // step2 with 500
    // step3 with 700
    // result is 900
    // doIt: 1507.251ms
    

    相关文章

      网友评论

          本文标题:ES2017 async 函数

          本文链接:https://www.haomeiwen.com/subject/tglztftx.html