等待继续循环后完成每个承诺

时间:2017-11-12 09:21:27

标签: node.js asynchronous promise

下面我有两个功能。其中一个返回一个promise,我希望在每个循环中等待它先完成然后移动一个。正如您将在下面看到的,结果不是所需的/同步的。我不应该使用async.forEachof

function test(num, callback)
{
    console.log("inside function: "+num)
    return new Promise((resolve, reject) => {
        my.promise(num).then(() => {
            console.log("done: "+num)
            resolve(callback);
        }).catch(e => console.error(e));
    }).catch(console.error);
}

function start_function()
{
    //stuff
    async.forEachOf(arr, function (itm, i, callback){
        console.log(i)
        test(i, callback).catch(e => console.error(e));
    }, function (err) {
        console.log("ALL DONE")
    });
}

结果:

0
inside function 0
1
inside function 1
2
inside function 2
done: 0
done: 2 //wrong should always be 1, finished before the previous promise.
done: 1 //wrong
ALL DONE

我不想使用PromiseAll不是因为我不想要,而是因为我需要每个承诺等待前一个结果,然后开始下一个。因此,将它们全部收集起来然后等待它们以任何顺序和我需要做的事情完成是没有意义的。

2 个答案:

答案 0 :(得分:1)

如果我没错,你究竟想要做什么,但你应该避免在Promise函数中传递回调并解决它。您可以使用此代码实现相同的操作,并从测试函数中删除回调。

function start_function()
{
    //stuff
    arr.forEach(async function (itm, i, array){
        console.log(i)
        try {
            await test(i);
        }
        catch(err){
            console.log(err);
        }
    });
}

以下是测试功能的外观,

function test(num)
{
    console.log("inside function: "+num)
    return new Promise((resolve, reject) => {
        my.promise(num).then(() => {
            console.log("done: "+num)
            resolve();
        }).catch(e => {
              console.error(e)
              reject(e);
        });
    });
}

答案 1 :(得分:1)

这种方法怎么样:

(function loopOnItems(i) {           

        dummyGoogleAPI.someAsyncMethod(data).then(function (_response) {                
            // do something with response          
        })
        .catch(function (error) {
            console.error(error);
        });

        if (--i){
            loopOnItems(i);    
        }//  decrement i and call loopOnItems again if i > 0
        else{
            _callback(errors);
        }            
})(count);

您有一些count,我们调用loopOnItems方法直到计数> 0