如何知道递归异步任务何时完成

How to know when a recursive, asynchronous task finishes

本文关键字:何时完 任务 异步 何知道 递归      更新时间:2023-09-26

我有一个异步函数,它可以递归到自身。

每次函数运行时,我都会将 jQuery 延迟添加到数组中,这是一种用于检查所有承诺是否已解决的使用$.when()。我的问题是,如果没有任意超时,我似乎无法做到这一点,因为我根本不知道函数何时停止递归并添加新承诺。

  • 这是一个JSBin演示。
  • 这是现实世界的例子。

仅同步推送到promises,以便您知道何时完成。由于您的函数是递归的并返回一个承诺,因此您可以只使用递归调用的结果承诺。仅对当前递归级别的结果使用 $.when(),而不是对调用堆栈中的所有承诺使用。

还要检查我对理解 node 中的承诺的答案.js递归函数和是否有将原始 Q 承诺库与 node 一起使用以递归方式异步遍历目录的示例? - 即使他们没有使用jQuery的实现,他们也应该给你一个如何做到这一点的想法。

只是为了补充Bergi所说的话,并澄清潜在的问题:

没有办法知道什么时候不再的承诺会被链接到一个.then的承诺上。就像没有办法从函数中知道它返回的位置一样:

myPromise().then(function(vale){
        // I have no easy way to know when handlers will no longer be added to myPromise
        // from myPromise itself
});

就像:

 function mySynchronousFunction(){
      // I can't easily tell from here where this code returns or how many time it will
      // be called in the entire program lifecycle.
 };

您将如何使用同步代码解决该问题?您可能一开始就不会拥有它。您比依赖全局程序状态和函数中的调用方更了解:)

这类似于承诺。您不依赖于最后一个处理程序何时添加到 promise 代码中。

相反,你想做的是在你的实际例子中调用.forEach内部承诺的$.when,这会让你在它们全部完成时抓住它们,并且只有在他们内心的承诺解决时才依次解决它们 - 这只是真正返回它们,因为承诺是递归解

开的。

除了 Bergi 的样本都很好 - 请参阅 Petka 的实现,它应该给你一个大致的概念:)

祝你好运。


作为旁注 - 你根本没有真正使用承诺作为承诺。您更多地将它们用作回调。如果您希望一个承诺等待另一个承诺完成,您可以使用.then

promiseReturning1().then(promiseReturning2).then(promiseReturning3).then(function(lastResult){
       // all done here
});

而不是实现自己的异步队列。