NodeJS事件循环执行顺序(process.nextTick and promise)
NodeJS eventloop execution order(process.nextTick and promise)
运行 下面的代码将得到: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
case2
免责声明
Node.js 绝对不保证 process.nextTick
和承诺回调的顺序。
我们 可能 在补丁版本中打破它,因为我们不认为它是 public API.
的一部分
您可能不会依赖承诺的内部顺序和nextTick
来做事。
这个特殊案例
这个特殊案例是 "bug" 我们处理 promises/callbacks 的方式。它最近已修复(在 semver 补丁中)——通过获取夜间版本的 Node,您将看到预期的执行顺序。
运行 下面的代码将得到: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
case2
免责声明
Node.js 绝对不保证 process.nextTick
和承诺回调的顺序。
我们 可能 在补丁版本中打破它,因为我们不认为它是 public API.
的一部分您可能不会依赖承诺的内部顺序和nextTick
来做事。
这个特殊案例
这个特殊案例是 "bug" 我们处理 promises/callbacks 的方式。它最近已修复(在 semver 补丁中)——通过获取夜间版本的 Node,您将看到预期的执行顺序。