如何知道递归异步任务何时完成
How to know when a recursive, asynchronous task finishes
我有一个异步函数,它可以递归到自身。
每次函数运行时,我都会将 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
});
而不是实现自己的异步队列。
- 当使用Watchify时,Browserify+Babelify Gulp任务没有终止
- gulp Iconify任务抛出错误TypeError:Path必须是字符串.收到false
- 浏览器何时记录历史记录
- 为什么要对define.md和module.exports进行条件检查,以及条件何时通过
- 如果助手不在,如何从Grunt中的代码中调用任务
- 让javascript知道epub3电子书中何时播放媒体覆盖
- WinJS(WP8.1):从后台任务更新辅助磁贴
- 如何使用gump任务将html转换为javascript字符串
- 在等待异步任务时永久循环
- 如何判断何时将dom节点添加到文档中
- 如何确定Vue何时完成DOM更新
- 如何在dhtmlxgantt中保存任务
- Express.js和multer:如何知道文件何时全部上传
- 何时可以;我的用户脚本在Javascript中触发右键单击(上下文菜单)
- jQuery:如何检测用户何时再次滚动到顶部
- Google Chrome扩展程序可以检测所有脚本何时加载完成吗
- 如何为requirejs和qunit设置grunt任务
- 使用 setTimeout 在不阻止输入的情况下运行大型任务,并使用 Promise 找出任务何时完成
- 在Node.js中,我如何判断何时解析完网页
- 如何知道递归异步任务何时完成