我的应用程序中有一个奇怪的计时错误,它来自从Bluebird切换到本机承诺。我解决了这个问题,但遗留下来的是这种古怪:原住民的承诺似乎在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
答案 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
请注意,您的代码无论如何都不应依赖这些行为。