我将尝试通过示例说明问题(我在这里使用JavaScript,但您可以使用任何语言):
我可能有一个设备,我想在该设备达到特定状态之前保持我的应用程序。如果我可以使用同步方法来获取设备状态,则代码可能如下所示:
// Hold until the desired state is reached
var state = false;
while (!state) {
state = device.getStateSync();
}
// [...] continue the program
我的问题是:当我从设备得到一个异步的getState函数时,我应该如何转换这段代码?代码应该在调用的执行时间不确定的情况下正常工作,并且应该考虑到我正在使用有限的内存和堆栈大小。
// [...] This would call the async function in a loop and crash the program
while (!state) {
// [...] something
device.getStateAsync(function(newState) {
state = newState;
});
// [...] something else
}
我找到了一篇有递归解决方案的帖子(http://blog.victorquinn.com/javascript-promise-while-loop)。虽然这是一个不错的解决方案,但如果循环调用太频繁,它最终会遇到堆栈大小问题。
目前我有一种直觉,即可能没有解决方案。你知道有什么方法可以做到这一点吗?或者你知道如何证明没有办法做到吗?请随意包括更复杂的概念,例如线程、Promise或Future。
请记住,这是一个理论问题,示例是为了说明在我无法更改正在使用的框架(或设备)的情况下。
感谢每一个回应和想法!
Pedro
while
循环。只需让回调函数调用getStateAsync
直到state
不允许为止。完全没有调用堆栈大小问题。 - cookie monster