首页 > web前端 > js教程 > 正文

JavaScript中promise和setTimeout执行顺序的问题(代码示例)

不言
发布: 2019-01-26 09:13:47
转载
3602人浏览过

本篇文章给大家带来的内容是关于javascript中promise和settimeout执行顺序的问题(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

promise为es6引进的语言标准,为异步编程的一种解决方案;

阅读此文的前提是了解浏览器event loop的机制,还有promise的基本用法和特性,比如他自执行特性、状态不可逆特性等

抛出问题

且看下面代码和问题

setTimeout(function(){console.log(1)},0);
new Promise(function(resolve){
    console.log(2)
    for( var i=0 ; i<10000 ; i++ ){
        i==9999 && resolve()
    }
    console.log(3)
}).then(function(){
    console.log(4)
});
console.log(5);
// 这的问题是,为什么答案是 2 3 5 4 1
// 而不是 2 3 5 1 4
登录后复制

既然promise.then和setTimeout都是异步的,那么在事件循环队列中  promise.then的事件应该排在setTimeout后面,那为什么promise.then却在setTimeout前面被打印了出来?

立即学习Java免费学习笔记(深入)”;

重要概念

event loop 的概念

  • Javascript是单线程的,所有的同步任务都会在主线程中执行。

  • 当主线程中的任务,都执行完之后,系统会 “依次” 读取任务队列里的事件。与之相对应的异步任务进入主线程,开始执行。

  • 异步任务之间,会存在差异,所以它们执行的优先级也会有区别。大致分为 微任务(micro task,如:Promise、MutaionObserver等)和宏任务(macro task,如:setTimeout、setInterval、I/O等)。

  • Promise 执行器中的代码会被同步调用,但是回调是基于微任务的。

  • 宏任务的优先级高于微任务

  • 每一个宏任务执行完毕都必须将当前的微任务队列清空

  • 第一个 script 标签的代码是第一个宏任务

  • 主线程会不断重复上面的步骤,直到执行完所有任务。

我的理解

我们来捋一遍代码的执行过程,

所有的代码都写在script标签中,所以读取所有代码是第一个宏任务,我们开始执行第一个宏任务。

我们首先遇到setTimeout,他是第二个宏任务,将它扔进宏任务事件队列里先排队。

下来我们遇到promise,promise执行器里的代码会被同步调用,所以我们依次打印出2和3。

下来遇到promise的回调,他是一个微任务,将它扔进微任务事件对列中。

下来我们接着打印出5,然后执行微任务并且打印出4.

我们第一个宏任务执行完毕,执行下一个宏任务,打印出1,到此,所有任务都执行完毕。

所以我们最后的结果为2 3 5 4 1。

以上就是JavaScript中promise和setTimeout执行顺序的问题(代码示例)的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:segmentfault网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号