所以我试图将我的代码转移到" Promise world",并且在很多地方,当我不得不循环#34;具有异步功能 - 我只是以这种方式使用递归
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){
//...
});
感谢。
答案 0 :(得分:4)
我采用Promise.all
方法。
这样做是等到阵列中的所有承诺都解决了。映射将异步方法应用于数组中的每个项目并返回一个promise。
function doAsyncP() {
return new Promise((resolve) => {
doAsync(function() {
resolve();
});
});
}
Promise.all(
someArray.map(doAsyncP)
).then((msg) => {
//we're done.
});
答案 1 :(得分:1)
在递归函数中,您可以这样做:
...
if (idx < someArray.length) {
doAsync(function() {
resolve(doRecursion(idx + 1));
});
} else {
...
换句话说,当idx
小于someArray.length
时,您的承诺将解析为另一个承诺,这次通过调用doRecursion()
并以idx
递增来返回承诺一个人。在then
解析为除承诺之外的某个值之前,不会调用底部的doRecursion
回调。在这种情况下,它最终将以'done!'
。
那就是说,如果你使用promises,你可能根本不需要使用递归。您可能需要更多地重构代码,但我建议将@ BenFortune的答案作为替代方案。