我有一个异步函数,它可以递归到自身。
我每次运行函数时都会将jQuery延迟添加到数组中,使用$.when()
来检查所有承诺是否已解决。我的问题是,如果没有仲裁超时,我似乎无法做到这一点,因为我根本不知道该函数何时停止递归并添加新的承诺。
答案 0 :(得分:3)
只能同步推送到promises
,以便您知道完成的时间。由于您的函数是递归的并且返回一个promise,因此您可以使用递归调用的结果promise。仅对{em>当前递归级别的结果使用$.when()
,而不是对调用堆栈中的所有承诺使用。
同时检查我对Understanding promises in node.js for recursive function和Is 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
});
而不是实现自己的异步队列。