gpt4 book ai didi

javascript - 在 Javascript 的工作线程中阻塞异步调用

转载 作者:行者123 更新时间:2023-11-30 13:10:58 25 4
gpt4 key购买 nike

我在 javascript 中创建了一个需要无限循环的 Worker。在循环内部,它需要进行多个异步调用并等待它们完成后再继续。

有两种直接的方法可以做到这一点,我可以看到它们似乎都有致命的缺陷:

1)

while(true) {
var promise = async_call();
while(!promise.isResolved()) { }
}

2)

var func = function() {
var promise = async_call();
promise.done(func);
}
func();

对于 #1,它崩溃了,因为内部 while 循环可能会消耗大量 cpu;如果线程不可中断,(javascript 线程可中断吗?我不认为它们是),那么 async_call 将永远没有机会完成,所以我们只会陷入循环.

对于 #2,如果有尾调用优化,它会工作得很好,但我认为没有任何 javascript 实现使用它,所以它会很快导致堆栈溢出或其他递归限制。

最后,我需要一种方法在两个循环应该终止时向它们发出信号。我可以通过将 bool stop 变量放入代码中轻松地做到这一点,但是,同样,这依赖于工作线程是可中断的,这样我就可以将 stop 设置为 true .

这里是否有我忽略或不熟悉的设计模式?我怎样才能让我的工作人员尽可能快地执行而不诉诸像 setInterval 这样的东西与轮询 isResolved 配对?

最佳答案

模式 2 非常好。如果回调真的是异步的(一些 Promise 库强制执行),它不会以堆栈溢出结束,因为事件将使用全新的堆栈执行。仅当您同步调用 func 时才会溢出,但您只是将其同步注册为回调。

关于javascript - 在 Javascript 的工作线程中阻塞异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13918131/

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