node.js - 继续循环后等待每个 promise 完成

标签 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 不是因为我不想,而是因为我需要每个 Promise 等待前一个的结果,然后开始下一个。因此,将它们全部收集起来,然后等待它们按照我需要做的任何顺序完成是没有意义的。

最佳答案

如果我没记错的话,你到底想做什么,但你应该避免在 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);
        });
    });
}

关于node.js - 继续循环后等待每个 promise 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47247203/

相关文章:

node.js - fs.existsSync 在 Electron 中使用时不是函数

node.js - 编译时 tsc 忽略 index.d.ts 类型定义

javascript - 这两行代码有什么区别?

Javascript Promise 链问题 (Ember)

node.js - 我想学习如何处理异步代码的 Node js 代码

node.js - 退出 Array.map() 循环

javascript - 如何从 Flutter 调用异步 JS 函数并获取结果?

javascript - 检测图像中嵌入的内容

javascript - 打破 promise 链(具有多个快乐流和单链)

c# - IAsyncEnumerable 或 IAsyncEnumerator 的工厂