【问题标题】:Async recursive using promise使用 promise 进行异步递归
【发布时间】:2016-02-22 20:48:52
【问题描述】:

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

谢谢。

【问题讨论】:

  • resolve(doRecursion(++idx)); - 如果你用 Promise 2 解析 Promise 1,那么 Promise 1 将用 Promise 2 的解析值解析
  • 请停止使用promise constructor anti-pattern。这也适用于答案。

标签: javascript node.js recursion promise


【解决方案1】:

我会选择Promise.all 方法。

这样做是等到数组中的所有承诺都解决了。 map 会将 async 方法应用于数组中的每个项目并返回一个 promise。

function doAsyncP() {
    return new Promise((resolve) => {
        doAsync(function() {
            resolve();
        });
    });
}

Promise.all(
    someArray.map(doAsyncP)
).then((msg) => {
    //we're done.
});

【讨论】:

    【解决方案2】:

    在你的递归函数中,你可以这样做:

    ...
    if (idx < someArray.length) {
      doAsync(function() {
        resolve(doRecursion(idx + 1));
       });
    } else {
    ...
    

    换句话说,虽然idx 小于someArray.length,但您的promise 将解析为另一个promise,这一次通过调用doRecursion() 返回promise,并且idx 加一。 then 回调底部不会被调用,直到 doRecursion 解析为除了承诺之外的某个值。在这种情况下,它最终会解析为'done!'

    也就是说,如果您使用 Promise,您可能根本不需要使用递归。您可能需要更多地重构您的代码,但我建议您考虑将@BenFortune 的答案作为替代方案。

    【讨论】:

    • 如果您使用 Promise,则有点反模式 IMO。
    • @BenFortune 是的,我同意,但这就是提问者的要求。我以前从未想过使用带有 promise 的递归,这可能就是原因。提问者应该考虑您接受您的回答。
    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2020-02-10
    • 2018-06-10
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多