当前位置:网站首页>promise笔记(四)

promise笔记(四)

2022-08-10 16:31:00 hlz2516

宏队列与微队列

        当js程序执行到异步代码(如定时器,ajax请求等)时,会把异步回调函数放入到队列中,等到同步代码全部执行完后再从队列里取出函数执行。实际上,js有两个队列,分别是宏队列与微队列,宏队列专门放与定时器相关的异步回调,ajax回调,dom事件回调;微队列专门放promise回调和mutation observer回调,关于mutation observer我们现在不用了解,因为这个东西用的很少,所以只需要记住promise是放到微队列就行了。

        按照尚硅谷教程的说法,对于异步回调处理流程是这样的:

1. js引擎首先必须先执行所有的初始化同步任务代码

2. 每次准备从宏队列取出一个任务执行前,都要先将所有的微任务一个个取出来执行

为了验证上述流程,我们写一段代码:

      Promise.resolve(123).then((value)=>{
        console.log('resolved 1',value);
      })

      setTimeout(() => {
        Promise.resolve(456).then((value)=>{
        console.log('resolved 2',value);
      })
      }, 1);

      Promise.resolve(789).then((value)=>{
        console.log('resolved 3',value);
      })

      setTimeout(() => {
        console.log('setTimeout');
      }, 1);

  分析:

        在执行同步代码的过程中,先把第一个值为123的promise放入微队列,再把第一个setTimeout放入宏队列,再把值为789的promise放入微队列,最后把第二个setTimeout放入宏队列。

        接下来,先检查一遍微队列里有无待执行函数,发现有,于是取出那个值为123的promise成功回调函数并执行;此时微队列不为空,那么继续取出,789的那个promise成功回调函数执行;此时微队列为空,可以取宏队列了,于是从宏队列取出第一个setTimeout执行,发现有promise,于是把promise放入微队列,执行完毕;此时再检查微队列,发现有新的Promise于是取出执行那个456的回调;之后检查微队列为空,于是回到宏队列取出第二个setTimeout,打印输出;检查宏队列为空,程序结束。

结果:

resolved 1 123
resolved 3 789
resolved 2 456
setTimeout

原网站

版权声明
本文为[hlz2516]所创,转载请带上原文链接,感谢
https://blog.csdn.net/hlz_12345/article/details/126157893