
promise 输出顺序面试题
问题
这是在某网站上看到的面试题:
promise.resolve().then(() => {
console.log('start');
return promise.resolve('end');
}).then(res => {
console.log(res);
});
promise.resolve().then(() => {
console.log(1);
}).then(() => {
console.log(2);
}).then(() => {
console.log(3);
}).then(() => {
console.log(4);
}).then(() => {
console.log(5);
}).then(() => {
console.log(6);
});打印输出的顺序是什么?
答案
不同的浏览器和 ide 中,输出顺序可能有所不同。但是,在大多数情况下,输出顺序为:
start 1 2 3 end 4 5 6
原因
promise.resolve() 返回的结果是一个 promise 对象,可以通过 .then() 方法添加回调函数。当一个回调函数执行时,会将一个微任务添加到微任务队列中。
在第一个 promise 中,.then() 回调函数中返回了一个 promise 对象。这会导致:
- 微任务队列中添加一个微任务来解析返回的 promise。
- 微任务队列中添加一个微任务来调用第二个 .then() 回调函数。
因此,在解析第一个 promise 之前,第二个 promise 的第一个回调函数已经添加到了微任务队列中。当两个 promise 都解析完成后,微任务队列中的微任务按添加顺序依次执行。
在第二个 promise 中,.then() 回调函数是链式调用的。每个回调函数都添加了一个微任务到微任务队列中。因此,当它们解析完成后,微任务队列中的微任务按添加顺序执行。










