我在我的应用程序中遇到了一个奇怪的时间错误,这是从Bluebird切换到原生Promise导致的。我已经修复了它,但留下了这种古怪的现象:原生Promise似乎在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
setImmediate
)。我认为没有任何规范告诉我们应该发生什么,实现(node V8)可以自由决定其认为合理的事情。 - BerginextTick
和setImmediate
是 Node 的构造,而不是 V8 的一部分,我认为 Node 应该以可靠的方式定义它。 - user578895setImmediate
在浏览器中也是可用的,并且有一个草案将其纳入 HTML5 规范。但是,是 Node 需要并且确实定义了它,因此它应该像现在这样工作。关于此事,Node 可能有一些文档,您是在寻找这些吗? - Bergi