Javascript / Node.js线程

我有这段代码,这是一个在完成时调用全局variables的函数。 而一个检查循环,继续。

var go; function (doSomething, callback) { //callback is called after 1 sec. } function callBack() { go = true; } while(true) { if (go) { break; } } 

我的问题是:callback有没有机会设置“走出去”的全球? 看起来在我的testing中,while循环阻止了其他可能的执行。 这是JavaScript / NodeJS做的吗?

简短的回答:没有。由于您阻止线程,callback将永远不会执行。 该程序将无限响应。

NodeJS实际上是单线程的; 所有长时间运行的操作,I / O等应该是asynchronous的(在这种情况下,这通常意味着在工作者线程或类似的东西上执行实际耗时的工作,但是从客户端代码看不到)。

要在你的例子中有一个事件循环或阻塞代码将不能在这样的环境中工作(的确,环境本身已经提供了事件循环)。 您应该重新devise您的代码以asynchronous工作。 代替循环和等待成为真正的,你可以运行任何代码依赖在callback中是真实的(这可能意味着你不需要首先go标志,全局variables很less是这些types的好select东西的)。

如果需要的话,有机制产生工作线程,subprocess等,但是在你的例子中显示的简单说明的情况下,这并不适用。

编辑:你提到你的问题是真的如何同步两个不同的条件,并执行代码一旦完成。 对于“香草”的JavaScript,你当然可以有两个标志,每个标志由相应的callback设置,callback也将调用一个函数,validation所有需要的条件。 如:

 var flag1 = false; var flag2 = false; func1(someParam, function() { flag1 = true; checkFlags(); }); func2(someParam, function() { flag2 = true; checkFlags(); }); function checkFlags() { if (flag1 && flag2) { // both functions have completed, the callbacks have executed // and set both flags. Now go ahead and do stuff. } } 

有了这个代码,func1或者func2完成并且首先调用它的callback并不重要,因为这两个callback都会调用checkFlags()来确保两个标记都被设置。 由于所有代码都将在同一个线程中运行,因此不需要进一步的并发相关的同步。

这些types的东西也有更高级的机制可用。 一个常用的技术是使用Promise。 Promise支持多个asynchronous调用的串联或并行简单链接,并支持将多个函数调用同步到一个共同的结果,以及提供大量其他有用的东西。 然而,使用承诺需要您的function来支持它; 而不是以一个或多个callback函数作为参数,函数应该返回promise对象。 许多框架使用开箱即用的承诺。