while 循环中的异步函数

tor*_*dro 5 javascript theory asynchronous callback synchronous

我有一个关于如何在 while 循环中执行异步任务直到满足某些条件的问题。这更多是一个理论问题,但我可以看到在某些情况下这可能是一个问题。

我将尝试在示例中演示该问题(我在这里使用 JavaScript,但您可以使用任何语言):

我可以有一个设备,我想保留我的应用程序,直到该设备达到特定状态。如果我可以获取设备状态的方法是同步的,则代码可能如下所示:

// Hold until the desired state is reached
var state = false;
while (!state) {
    state = device.getStateSync();
}
// [...] continue the program
Run Code Online (Sandbox Code Playgroud)

我现在的问题是:当我从设备获得的只是异步 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
}
Run Code Online (Sandbox Code Playgroud)

我发现的这篇文章有一个递归解决方案(http://blog.victorquinn.com/javascript-promise-while-loop)。虽然这是一个很好的解决方案,但在某些时候它会遇到堆栈大小的问题,如果循环调用太频繁。

现在我有直觉认为可能没有解决方案。你知道有什么方法可以做到这一点吗?或者你知道如何证明没有办法做到吗?随意包含更复杂的概念,如线程、承诺或期货。

请记住,这是一个理论问题,该示例适用于我无法更改正在使用的框架(或设备)的情况。

感谢您的每一个回应和想法!

佩德罗

jca*_*ron 0

这确实是一个非常理论化的问题。使用异步 API 来获取当前状态会很奇怪。您很可能会拥有:

  • 为您提供当前状态的同步方法;
  • 或者当状态改变时会回调你的异步方法。在这种情况下,不需要循环,只需等待回调即可。

但如果您确实有此类 API 的具体示例,请告诉我们...