我的应用程序中有一个奇怪的计时错误,它来自于从“蓝知更鸟”到“本地承诺”。我修复了它,但我留下了这个奇怪的地方:本土的承诺似乎在nextTick和setImmediate之间摇摆--怎么回事?这应该发生吗?在这些问题上,承诺将走向何方?
~function(){
setTimeout (console.log.bind(console, 'timeout A'));
process.nextTick (console.log.bind(console, 'nextTick A'));
setImmediate (console.log.bind(console, 'setImmediate A'));
Promise.resolve().then(console.log.bind(console, 'promise'));
process.nextTick (console.log.bind(console, 'nextTick B'));
setImmediate (console.log.bind(console, 'setImmediate B'));
setTimeout (console.log.bind(console, 'timeout B'));
}();本地产量:
nextTick A
nextTick B
promise undefined
setImmediate A
setImmediate B
timeout A
timeout B蓝鸟产量:
nextTick A
nextTick B
setImmediate A
promise undefined
setImmediate B
timeout A
timeout B发布于 2015-09-08 16:06:48
本土的承诺似乎在nextTick和setImmediate之间摇摆--怎么做?这应该发生吗?在这些问题上,承诺将走向何方?
是的,承诺在微任务nextTick队列之后和任何任务(如setImmediate)执行之前运行。
这是他们的预期行为,以及我们期望他们在NodeJS中所做的事情。这是决定在这里,你可以读到它,这里
蓝鸟的不同行为
蓝知更鸟的行为早于本机承诺,蓝鸟3.0使用nextTick和微任务语义进行调度。蓝鸟允许您使用Promise.setScheduler和nextTick作为调度器(而不是setImmediate)手动覆盖此行为。
您可以看到这里的代码:
GlobalSetImmediate.call(global, fn)请注意,无论如何,您的代码不应该依赖这些行为。
https://stackoverflow.com/questions/32453877
复制相似问题