美文网首页
探索promise,async,await(1)

探索promise,async,await(1)

作者: BulletYuan | 来源:发表于2019-05-10 14:04 被阅读0次

    前天遇到了

    function _promiseFn(){
      return new Promise(resolve=>{
        resolve('I am Iron Man!');
      });
    }
    const _res = await _promiseFn();
    console.log(_res); // 'I am Iron Man!'
    

    这样的代码,一直百思不得其解: await如何返回promise后resolve的结果?

    PS:上面的代码放在代码块中不能运行,毕竟 await 没有放在 async 函数之中,不过浏览器的控制台是可以直接运行的。我猜测应该是控制台的执行层外面就是 async 函数吧?

    其实这个问题的背后更深层的问题就是: async和await分别做了什么?

    google了一些文章发现这篇文章讲的还不错,有兴趣的朋友可以翻译来看看。


    Async

    a function always returns a promise.

    • async 函数会自动返回一个 promise 类型的方法

    • 如果设置了函数返回的值,js也会默认将这个返回值放入到 promiseresolve 结果中

    Await

    makes JavaScript wait until that promise settles and returns its result.

    • 会让js“暂停”当前 async 函数内的执行

    • 会把返回的 promise 放入到任务队列中挂起

    • 让出主线程(javascript是单线程执行)去执行其他方法,直到该此线程执行完成,才会继续去任务队列中依次取出 promise 的返回结果


    示例

    浏览器控制台中输入:

    function _fn(){
      return new Promise(res=>{
        setTimeout(()=>res(4),1000);
      });
    }
    console.log(1)
    await (
      ()=>{
        setTimeout(()=>console.log(2),0);
      }
    )(); // (fn)() 立即执行的匿名函数
    console.log(3)
    console.log(await _fn())
    console.log(5)
    setTimeout(()=>console.log(6),0)
    

    按照我之前的思想,他的打印应该是:

    // console.log(1)
    // console.log(3)
    // console.log(5)
    // console.log(2)
    // console.log(4)
    // console.log(6)
    

    现在理解了 async/await 的执行机制,await 会等待返回 promiseresolve 结果。

    那么正确的打印应该是:

    // console.log(1) -- 正常执行
    // console.log(3) -- 正常执行
    // console.log(2) -- 返回的延时函数会放在下一次事件循环的0s后执行
    // console.log(4) -- 返回的延时函数会放在下一次事件循环的1s后执行
    // console.log(5) -- 会因为上个await返回的延时事件阻塞1s
    // console.log(6) -- 返回的延时函数会放在再下一次事件循环的0s后执行
    

    参考文章

    相关文章

      网友评论

          本文标题:探索promise,async,await(1)

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