setTimeout(function(){
console.log('D')
},0)
var promise = new Promise(function(resolve, reject){
console.log('A')
resolve()
}).then(function(){
console.log('C')
})
console.log('B');
// A
// B
// C
// D
首先关于setTimeout是一个队列执行,这里类似于setTimeout的还有很多,比如node中的:setImmediate, process.nextTick等,都是类似机制。
这些函数都是延时执行,顾名思义就是要放进队列排队的,哪怕设置了延时0.
但是 Promise是什么呢
简单说,不过是 一种 异步编程的解决方案,说白了是改变之前 回调函数写法的 问题。Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。而这个存储的队列是promsie本身维护的自己的队列,千万不要和setTimeout的系统事件调度队列混淆。
针对这个问题,这个promise没有异步,所以promsie的状态马上就变成了 resolve的,所以呢,通过then注册的回调函数马上就会调用。基本是就是同步执行而已。当然比setTimeout先执行。
这里涉及到异步的宏任务和微任务
setTimeout是宏任务【macrotask】,Promise整体是微任务【microtask】,
Promise 是放入 microtask 队列的, 而 setTimeout 放入 macrotask 队列.
主线程执行完了之后,先处理微任务【microtask】队列, 【微任务】队列每次处理直到队列为空, 接下来处理【宏任务】队列,【宏任务】 每次只处理的队列里的第一个任务, 当任务处理完后, 又会进入到【微任务】队列的处理. 如此反复。
网友评论