美文网首页
promise,setTimeout执行顺序

promise,setTimeout执行顺序

作者: 三文治z | 来源:发表于2019-09-25 15:59 被阅读0次
    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

    相关文章

      网友评论

          本文标题:promise,setTimeout执行顺序

          本文链接:https://www.haomeiwen.com/subject/tifwuctx.html