以下运行代码将获得:c,a,d,b
// case 1
const test = async () => {
new Promise((resolve) => {
resolve('a');
}).then(r => console.log(r));
process.nextTick(() => {
console.log('c');
});
console.log(await 'd');
return 'b';
};
(async () => {
const r = await test();
console.log(r);
})();
但是,如果我将process.nextTick放在await 'd'
// case 2
const test = async () => {
new Promise((resolve) => {
resolve('a');
}).then(r => console.log(r));
console.log(await 'd');
process.nextTick(() => {
console.log('c');
});
new Promise((resolve) => {
resolve('e');
}).then(r => console.log(r));
return 'b';
};
(async () => {
const r = await test();
console.log(r);
})();
我得到:a,d,e,b,c
为什么process.nextTick的执行顺序会像这样改变?
根据我的限制知识,nextTick
在Promise.resolve()
之前运行,如case1
所示,所以我希望在{{a,d,c,e,b
而不是a,d,e,b,c
1}}
答案 0 :(得分:2)
Node.js绝对不保证process.nextTick
的顺序和承诺回调。
我们可能在修补程序版本中将其打破,因为我们不认为它是公共API的一部分。
你可能依赖承诺的内部顺序和nextTick
来做事。
这个特例是一个" bug"我们有时如何处理承诺/回调。最近修复了(在semver-patch中) - 通过获取每晚版本的Node,您将看到预期的执行顺序。