gpt4 book ai didi

Javascript/Node.js 线程

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:53 25 4
gpt4 key购买 nike

我有这段代码,它是一个函数,它在完成时有一个回调,可以将全局 go 更改为 true。还有一个检查 go 的循环,然后继续。

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为了实现这一点,您可以运行依赖于 go 的任何代码。在回调中为 true (这可能意味着您首先不需要 go 标志,全局变量对于这些类型的事情很少是一个好的选择)。

如果需要,有机制可以生成工作线程、子进程等,但这并不真正适用于示例中所示的简单说明性案例。

编辑:您提到您的问题实际上是如何同步两个不同的条件,并在满足两个条件后执行代码。使用“vanilla”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 先完成并调用其回调并不重要,因为这两个回调都会调用 checkFlags(),这将确保设置两个标志。由于所有代码都将在同一线程中运行,因此也无需进一步进行与并发相关的同步。

还有更高级的机制可用于此类事情。一种常见的技术是使用 Promise。 Promise 可以简单地串联或并行地链接多个异步调用,并支持将多个函数调用同步到一个公共(public)结果中,并提供大量其他有用的东西。然而,使用 Promise 需要你的函数支持它;函数不应将一个或多个回调函数作为参数,而应返回 Promise 对象。许多框架都使用开箱即用的 Promise。

关于Javascript/Node.js 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33430810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com