常见异步

一、常见宏任务和微任务

宏任务(macro task)
微任务(micro task)
  • 同步代码

  • setTimeout/setInterval/setImmediate

  • UI交互事件

  • I/O(node.js)

  • process.nextTick(node.js)

  • Promise

  • async/await

  • MutaionObserver

二、在事件循环中的应用

面试题1:

console.log('1');
setTimeout(function() {
    console.log('2');
    process.nextTick(function() {
        console.log('3');
    })
    new Promise(function(resolve) {
        console.log('4');
        resolve();
    }).then(function() {
        console.log('5')
    })
})
process.nextTick(function() {
    console.log('6');
})
new Promise(function(resolve) {
    console.log('7');
    resolve();
}).then(function() {
    console.log('8')
})
setTimeout(function() {
    console.log('9');
    process.nextTick(function() {
        console.log('10');
    })
    new Promise(function(resolve) {
        console.log('11');
        resolve();
    }).then(function() {
        console.log('12')
    })
})

输出:

面试题2:

输出:

为什么promise3出现在promise5?

promise3是在promise2执行完成后加入到微任务队列的,此时promse5已经在微任务队列中了

setTimeout(callback, delay)的delay如何理解?

这个时间值代表了消息被实际加入到队列的最小延迟时间,而非确切的等待时间。

例如:setTimeout(() => console.log('called'), 100)代表100毫秒后放入到宏任务队列,如果在这之前微任务队列有其他任务,则等待时间一定大于100毫米。

详解参见:入口

await后面的代码为啥是微任务?

async-await 只是 Promise+generator 的一种语法糖而已。

例如:

等同于:

Promise的微任务什么时候加入到微任务队列?

Promise的微任务必须是实例的状态变成非pending之后加入到微任务队列

注意观察promise3和promise4的输出顺序

输出:

参见:

Last updated