Javascript/Node.js线程

Javascript/Node.js线程,javascript,node.js,Javascript,Node.js,我有这段代码,一个函数在完成时有一个回调,它将全局变为true。还有一个循环,检查继续,继续 var go; function (doSomething, callback) { //callback is called after 1 sec. } function callBack() { go = true; } while(true) { if (go) { break; } } 我的问题是:回调是否有机会设置“go”全局值?在我的测试中,while循环

我有这段代码,一个函数在完成时有一个回调,它将全局变为true。还有一个循环,检查继续,继续

var go;

function (doSomething, callback) {
  //callback is called after 1 sec.
}

function callBack() {
  go = true;
}

while(true) {
  if (go) {
    break;
  } 
}

我的问题是:回调是否有机会设置“go”全局值?在我的测试中,while循环似乎正在阻止所有其他可能的执行。JavaScript/NodeJS就是这样做的吗?

简短回答:不。回调永远不会执行,因为您正在阻塞线程。程序将无限无响应

NodeJS是有效的单线程;所有长时间运行的操作、I/O等都应该是异步的(在后台,这通常意味着在工作线程或类似线程上执行实际耗时的工作,但从客户机代码中看不到)

在这样的环境中,像您的示例中那样使用事件循环或阻塞代码是不起作用的(事实上,环境本身已经提供了事件循环)。您可能应该重新设计代码以异步工作。与循环等待
go
变为true不同,您可以运行任何依赖于
go
在回调中为true的代码(这可能意味着您首先不需要
go
标志,对于这类事情,globals很少是一个好的选择)

如果需要,可以使用一些机制来生成工作线程、子进程等,但在示例中所示的简单示例中,这并不适用

编辑:您提到的问题实际上是如何同步两个不同的条件,并在两个条件都满足后执行代码。使用“香草”javascript,您当然可以有两个标志,每个标志由其相应的回调设置,回调还将调用一个验证所有必要条件的函数。例如:

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是否完成并首先调用其回调并不重要,因为这两个回调都带有call checkFlags(),这将确保两个标志都已设置。由于所有代码都将在同一个线程中运行,因此也不需要进一步的并发相关同步


还有更先进的机制可用于这些类型的事情。一种常见的技巧是使用承诺。承诺支持多个异步调用的简单链接,可以是串行的,也可以是并行的,并支持将多个函数调用同步到一个公共结果中,以及提供大量其他有用的东西。但是,使用承诺需要您的功能来支持它;函数应该返回promise对象,而不是将一个或多个回调函数作为参数。许多框架使用开箱即用的承诺。

是的,繁忙的等待会阻止它等待的事件实际发生。“像您的示例中那样的事件循环在这样的环境中不起作用”-环境本身有事件循环!好的,谢谢你的阅读。这很有道理,只是让我回到了正轨:)我的“挑战”是等待2次(或更多)回调完成,然后继续执行。所以go=true实际上是:go=var1&&var2;您可以让第一个回调调用第二个回调调用,第二个回调调用其余代码。但是,然后等待这两个回调完成(这些是外部进程)。这不是很有效。我明白了,处理这件事的好方法是什么。我更新了我的答案,其中有一节是关于这个的。希望有帮助。下一步是理解承诺。谢谢。你提出的解决方案是如此“显而易见”。。。确实是这样。