使用promise的异步递归

时间:2016-02-22 12:17:44

标签: javascript node.js recursion promise

所以我试图将我的代码转移到" 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){
    //...
});

感谢。

2 个答案:

答案 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的答案作为替代方案。