我不完全确定我了解您的需求,但我相信您正在寻找的是创建并发函数调用,这意味着您可能需要运行潜在的计算密集型代码,而您不想要它在此计算运行时阻止其他代码执行。
Node.js通常用于单线程进程,这意味着在给定时间只能运行一段代码,但仍有一些方法可以做到。
正如@TJ Crowder 的回答中所述,一种方法是将您的函数调用与process.nextTick一起排队,以便它在事件循环的下一个周期运行。这可以帮助将密集计算分解为迭代,并且每次迭代都将排队等待在最后一个事件循环之后的下一个事件循环中运行。这在某些情况下会有所帮助,但并非总是可以将计算分解为彼此异步运行的迭代。如果您正在寻找有关 Javascript 如何异步运行的更详细说明,我建议您阅读这本书。
至少有两种其他方法(据我所知)可以使用Node.js实现某种并发- 工作者/线程和子进程。简而言之,子进程只是您的主应用程序运行的另一个 Node.js 进程。如果你想这样做,你可以使用Node.js的原生 *child_process* 模块来运行和管理你的子进程。查看官方文档了解更多信息。
第三种方法是以与浏览器中使用 Web Workers 的方式非常相似的方式使用 Workers。Worker 是在与主应用程序不同的操作系统线程中运行的代码片段。对我来说,这似乎是实现并发的最简单方法,尽管有些人会认为这不是最可靠的方法,并且创建子进程更好。
有一个很好的解释工人如何在MDN上工作。要在Node.js中使用 Workers,您需要一个外部模块,例如webworker-threads。
这是从您的示例创建的代码示例,其中包含他们文档中的片段:
var Worker = require('webworker-threads').Worker;
var worker = new Worker(function(){
onmessage = function(event) {
result = sum(event.data.a, event.data.b);
result = sum(result, event.data.c);
result = sum(result, event.data.d);
result = sum(result, event.data.e);
result = sum(result, event.data.f);
postMessage(result);
self.close();
};
});
worker.onmessage = function(event) {
console.log("The result is: " + event.data);
};
worker.postMessage({a: 1, b: 2, c: 3, d: 4, e: 5, f: 6});
// Do some other stuff that will happen while your Worker runs...
尽管如此,大多数人会尽量避免在Node.js中运行并发代码。Javascript 的异步特性使编写简单而简洁的后端代码变得容易,并且通常您希望通过不尝试将并发性引入应用程序来保持这种方式,除非绝对必要。