javascript中事件循环的执行顺序是什么

  介绍

这篇文章主要介绍javascript中事件循环的执行顺序是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

,,,,,,,,,,,,,,,,,,,,,,,,,,,,本篇文章给大家带来的内容是关于javascript中事件循环(事件循环)的执行顺序,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

简要介绍:谈谈promise.resove, setTimeout, setImmediate的过程。nextTick在EvenLoop队列中的执行顺序

<强>问题的来源

事件循环都不陌生,是指主线程从“任务队”列中循环读取任务,比如

例1:      setTimeout(函数(){console.log (1)}, 0);      console.log (2)//输出2 1

在上述的例子中,我们明白首先执行主线程中的同步任务,当主线程任务执行完毕后,再从事件循环中读取任务,因此先输出2,再输出1 .

事件循环读取任务的先后顺序,取决于任务队列(作业队列)中对于不同任务读取规则的限定。比如下面一个例子:

例2:      setTimeout (function  (), {   console.log才能(3);   },,0);      Promise.resolve(),然后(function  (), {   console.log才能(2);   });   console.log (1);//输出为,,1,,2,3

先输出1,没有问题,因为是同步任务在主线程中优先执行,这里的问题是setTimeout和承诺。然后任务的执行优先级是如何定义的。

执行顺序

在工作队列中的队列分为两种类型:macro-task和microTask。我们举例来看执行顺序的规定,我们设

macro-task队列包含任务:,a1, a2 ,, a3   micro-task队列包含任务:b1, b2 ,, b3

执行顺序为,首先执行marco-task队列开头的任务,也就是a1 (a1代表同步的主任务)任务,执行完毕后,在执行micro-task队列里的所有任务,也就是依次执行<强> b1, b2, b3 (异步),执行完后清空micro-task中的任务,接着执行marco-task中的第二个任务(异步),依次循环。

了解完了macro-task和micro-task两种队列的执行顺序之后,我们接着来看,真实场景下这两种类型的队列里真正包含的任务(我们以节点V8引擎为例),在节点V8中,这两种类型的真实任务顺序如下所示:

macro-task队列真实包含任务:

脚本(主程序代码)(对应上方的a1], setTimeout,, setInterval,, setImmediate,, I/O,, UI 呈现

micro-task队列真实包含任务:

process.nextTick,,承诺,,Object.observe,, MutationObserver

由此我们得到的执行顺序应该为:

脚本(主程序代码)→process.nextTick→承诺…——祝辞setTimeout——祝辞setInterval——祝辞setImmediate——祝辞,I/O——祝辞UI 呈现

在ES6中macro-task队列又称为ScriptJobs,而micro-task又称PromiseJobs

举例

(1) setTimeout和承诺

例3:      setTimeout (function  (), {   console.log才能(3);   },,0);      Promise.resolve(),然后(function  (), {   console.log才能(2);   });      console.log (1),

(2)的过程。nextTick和承诺,setTimeout

例子4:   setTimeout(函数(){console.log (1)}, 0);      new 承诺(函数(解决,拒绝){   ,,console.log (2);   ,才能解决();   })(函数(){console.log (3)   })(函数(){console.log (4)});      process.nextTick(函数(){console.log (5)});      console.log (6);//输出2、6、5、3、4、1

(3)更复杂的例子

setTimeout(函数(){console.log (1)}, 0);      new 承诺(函数(解决,拒绝){   ,,console.log (2);   ,,setTimeout(函数(){解决()},0)   })(函数(){console.log (3)   })(函数(){console.log (4)});      process.nextTick(函数(){console.log (5)});      console.log (6);//输出的是,,2,6,5,1,3,4

这些例子的原因请根据执行顺序执行判断,这里不一一解释了

以上是“javascript中事件循环的执行顺序是什么”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

javascript中事件循环的执行顺序是什么