我Worker
在 javascript 中创建了一个需要无限循环的。在循环内部,它需要进行几次异步调用并等待它们完成,然后再继续。
有两种直接的方法可以做到这一点,我可以看到两者似乎都存在致命缺陷:
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 实现都使用这个,所以它会很快导致堆栈溢出或其他递归限制。
最后,我需要一种方法在两个循环应该终止时向它们发出信号。我可以通过将布尔stop
变量放入代码中轻松地做到这一点,但是,这又依赖于工作线程是可中断的,因此我可以设置stop
为 true。
是否有我在这里忽略或不熟悉的设计模式?我怎样才能让我的工作人员尽可能快地执行而不诉诸诸如setInterval
与轮询配对之类的东西isResolved
?