promise,setTimeout执行顺序

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (2018年1月27日) 你轻轻撩起面纱,让我援藏不再孤独 暗夜中的星星 唤醒,躲在心窝中的青春梦 你穿上雪白的浣...
    老葫芦阅读 2,934评论 1 6
  • 今天我们下班啦?我们六个人装了13万不到。 忙了一天了,儿子刚睡着。不说了今天有点儿累明天再说
    七杀殿魔君杀阡陌常秋森M阅读 1,527评论 0 0
  • 写在前面 时间:2018.03.21 出行方式:s2火车 出行人物:独行 时长:1天 所带物品:一瓶水,零钱。轻装...
    sailor4518阅读 1,410评论 0 0
  • 每日分享2018年12月26日星期三 文/彭治旗 今天出差,大家在外面吃饭。一同事对着另一同事说,你今天不是生日吗...
    彭治旗阅读 2,286评论 2 2