NodeJS:process.nextTick vs即时回叫

我写了很多模块,看起来像这样:

function get(index, callback) { if (cache[index] === null) { request(index, callback); // Queries database to get data. } else { callback(cache[index]); } } 

注意:这是我的实际代码的一个简化版本。

该callback要么在相同的执行中被调用,要么在稍后的某个时间被调用。 这意味着模块的用户不能确定哪个代码首先运行。

我的观察是,这个模块重新引入了以前由JavaScript引擎解决的multithreading的一些问题。

问题:我应该使用process.nextTick还是确保在模块之外调用callback是安全的?

这完全取决于你在callback函数中做什么。 如果你需要确定callback在get回报时还没有被触发,你将需要process.nextTickstream程; 在很多情况下,你不关心callback何时触发,所以你不需要延迟执行。 不可能给出一个适用于所有情况的明确答案; 总是将callback延迟到下一个时间点应该是安全的,但这样做可能会有点低效,所以这是一个折衷。

唯一的情况是,我可以想到在什么地方需要推迟下一个时间点的callback,如果你真的需要在呼叫之后但在callback之前设置一些东西。 这也许是一个罕见的情况,也可能表明需要改善实际控制stream程; 你不应该完全依赖于你的callback被调用的时候,所以无论它使用什么环境,都应该在调用get地方设置。

在基于事件的控制stream程中(与基于callback的)相反,您可能需要推迟实际的事件触发。 例如:

 function doSomething() { var emitter = new EventEmitter(); cached = findCachedResultSomehow(); if (cached) { process.nextTick(function() { emitter.emit('done', cached); }); } else { asyncGetResult(function(result) { emitter.emit('done', result); }); } return emitter; } 

在这种情况下,在caching值的情况下,您需要推迟发射,否则事件将在doSomething的调用者有机会附加侦听器之前发射。 使用callback时通常不会有这个考虑。

http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony

如果您在内部进行callback,请select适合的callback

如果您正在创build其他人使用的模块,则asynchronouscallback应始终为asynchronous。