[英]Async recursive using promise
因此,我试图将我的代码转移到“承诺世界”中,并且在很多地方不得不使用异步功能“循环”时,我只是以这种方式使用了递归
function doRecursion(idx,callback){
if(idx < someArray.length){
doAsync(function(){
doRecursion(++idx,callback)
});
}else{
callback('done!')
}
}
doRecursion(0,function(msg){
//...
});
现在,我试图将其转变为Promise的世界,而我很困
var Promise = require('bluebird')
function doRecursion(idx){
return new Promise(function(resolve){
if(idx < someArray.length){
doAsync(function(){
//... doRecursion(++idx)
// how do i call doRecusion here....
});
}else{
resolve('done!')
}
});
}
doRecursion(0).then(function(msg){
//...
});
谢谢。
我会选择Promise.all
方法。
这是要等到数组中的所有promise都解决了。 该映射将对数组中的每个项目应用async方法,并返回一个Promise。
function doAsyncP() {
return new Promise((resolve) => {
doAsync(function() {
resolve();
});
});
}
Promise.all(
someArray.map(doAsyncP)
).then((msg) => {
//we're done.
});
在递归函数中,您可以执行以下操作:
...
if (idx < someArray.length) {
doAsync(function() {
resolve(doRecursion(idx + 1));
});
} else {
...
换句话说,当idx
小于someArray.length
,您的promise将解析为另一个promise,这一次,通过调用doRecursion()
返回的doRecursion()
将idx
加1。 then
,直到doRecursion
解析为promise以外的其他值,才会调用底部的then
回调。 在这种情况下,它最终将以'done!'
值解析'done!'
。
就是说,如果您使用的是Promise,则可能根本不需要使用递归。 您可能需要多重构一些代码,但是我建议考虑使用@BenFortune的答案作为替代方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.