节点如何在`nextTick`和`setImmediate`之间进入?

时间:2015-09-08 09:19:15

标签: node.js promise timing

我的应用程序中有一个奇怪的计时错误,它来自从Bluebird切换到本机承诺。我解决了这个问题,但遗留下来的是这种古怪:原住民的承诺似乎在nextTicksetImmediate之间摇摆不定 - 怎么样?这应该发生吗?承诺应该关于这些?

~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

1 个答案:

答案 0 :(得分:3)

  

原生承诺似乎在nextTick和setImmediate之间摇摆不定 - 怎么样?这应该发生吗?承诺应该放在哪些方面呢?

是的,promises在microtask nextTick队列之后和任何任务(如setImmediate)执行之前运行。

这是他们的预期行为,以及我们期望他们在NodeJS中做的事情。这是decided here,您可以阅读here

  

蓝鸟的不同行为

Bluebird的行为早于原生承诺,bluebird 3.0使用nextTick和microtask语义进行调度。 Bluebird允许您使用import pandas as pd import numpy as np items = ['z1', 'z2'] major_axis = ['y1', 'y2', 'y3'] minor_axis = ['x1', 'x2', 'x3', 'x4'] macierz = np.random.rand(2,3,4) panel = pd.Panel(macierz, items = items, major_axis = major_axis, minor_axis = minor_axis) Promise.setScheduler作为调度程序(而不是setImmediate)手动覆盖此行为。

您可以看到the code here

nextTick

请注意,您的代码无论如何都不应依赖这些行为。