promise,setTimeout执行顺序

2019-09-25  本文已影响0人  三文治z
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】队列, 【微任务】队列每次处理直到队列为空, 接下来处理【宏任务】队列,【宏任务】 每次只处理的队列里的第一个任务, 当任务处理完后, 又会进入到【微任务】队列的处理. 如此反复。

相关文章 https://mp.weixin.qq.com/s/mT5XvdMnlw0Qt8EBvgDtYQ

上一篇下一篇

猜你喜欢

热点阅读