欢迎访问个人我的博客:http://www.xiaolongwu.cngit
promise为es6引进的语言标准,为异步编程的一种解决方案;es6
阅读此文的前提是了解浏览器event loop的机制,还有promise的基本用法和特性,好比他自执行特性、状态不可逆特性等github
且看下面代码和问题编程
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前面被打印了出来?promise
event loop 的概念浏览器
Javascript是单线程的,全部的同步任务都会在主线程中执行。异步
主线程会不断重复上面的步骤,直到执行完全部任务。异步编程
咱们来捋一遍代码的执行过程,oop
全部的代码都写在script标签中,因此读取全部代码是第一个宏任务,咱们开始执行第一个宏任务。学习
咱们首先遇到setTimeout,他是第二个宏任务,将它扔进宏任务事件队列里先排队。
下来咱们遇到promise,promise执行器里的代码会被同步调用,因此咱们依次打印出2和3。
下来遇到promise的回调,他是一个微任务,将它扔进微任务事件对列中。
下来咱们接着打印出5,而后执行微任务而且打印出4.
咱们第一个宏任务执行完毕,执行下一个宏任务,打印出1,到此,全部任务都执行完毕。
因此咱们最后的结果为2 3 5 4 1。
github资源地址:js基础进阶--promise和setTimeout执行顺序的问题
csdn博客地址:https://blog.csdn.net/wxl1555
若是您对个人博客内容有疑惑或质疑的地方,请在下方评论区留言,或邮件给我,共同窗习进步。
邮箱:wuxiaolong802@163.com