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

时间:2014-04-07 09:37:12

标签: javascript jquery asynchronous promise deferred

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

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

2 个答案:

答案 0 :(得分:3)

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

同时检查我对Understanding promises in node.js for recursive functionIs there an example of using raw Q promise library with node to recursively traverse a directory asynchronously?的回答 - 即使他们没有使用jQuery的实现,他们应该会告诉你如何做到这一点。

答案 1 :(得分:2)

只是添加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,这样可以在完成所有操作时为您提供挂钩,并且只解决它们反过来,当他们的内心承诺解决时 - 由于承诺递归地展开,这实际上就是回归它们。

除了Bergi的样本都很好 - 请参阅Petka's implementation,它应该给你一般的想法:)

祝你好运。


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

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

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