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

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

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

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

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

还要检查我对node.js中的promises的回答是否有 递归函数 , 是否有一个使用带有node的原始Q promise库以异步方式递归遍历目录的示例? – 即使他们没有使用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代码中添加最后一个处理程序的时间。

相反,你要做的就是在你的实际例子中调用$.when .forEach.forEach中的内部承诺,当你完成所有内容时会给你一个钩子,并且当他们的内心承诺解决时只能依次解决它们 -因为承诺递归地展开,所以它才真正回归它们。

除了Bergi的样本都很好 – 请参阅Petka的实现 ,它应该给你一般的想法:)

祝好运。


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

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

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