javascript - 有什么方法可以用 Promise.all 打破 promise 数组的并行执行

标签 javascript node.js async-await es6-promise promise.all

<分区>

我有并行线程,并且想在其中一个线程抛出错误时中断所有未完成的线程。 但似乎所有其他线程都在继续执行。

async test() {
    let threads = [];
    console.log('Starting threads');
    try {
        for (let i = 0; i < 10; i++) {
            threads.push(this.worker(i));
        }
        console.log(`Waiting for threads`);
        await Promise.all(threads);
    }
    catch (err) {
        console.log(err);
        throw err;
    }
}

async worker(i) {
    // Sleep for 2 seconds to emulate API request
    let p = new Promise((resolve, reject) => {
        return setTimeout(
            () => resolve(true),
            2000
        );
    }
    );
    await p;
    console.log(i);
    throw 'Error';
}

我得到日志

0
Error
1
2
3
4
5
6
7
8
9

因此,当第一次调用“worker”函数(i=0)时抛出错误时,它会被函数“test”中的“catch” block 捕获。然后错误被抛给上层函数,但其​​他 9 个 worker 仍然继续工作。 有什么办法可以打破它们?我只看到一种方法 - 在函数“测试”的捕获“ block ”中调用 process.exit,但它会中断所有程序而不是当前函数。

最佳答案

你应该使用 Promise.race: Promise.race() 方法返回一个 promise ,一旦可迭代对象中的 promise 之一实现或拒绝,该 promise 就会实现或拒绝,并返回该 promise 的值或原因。

查看更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race .

关于javascript - 有什么方法可以用 Promise.all 打破 promise 数组的并行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63523219/

相关文章:

javascript - 将参数传递给 matchmedia addListener 回调函数

javascript - JQuery Click 函数只运行最后一个 IF 语句

javascript - 如何使用sqlite3更新node js?

node.js - Docker 不会将文件更改从主机传播到容器

asp.net-mvc-4 - 异步等待 MVC Action 返回 Task 而不是 ActionResult

node.js - 无法使用 map() 和 async-await 将项目推送到数组

c# - async/await 单元测试代码覆盖率

javascript - 访问 promise 之外的数据

javascript - 扩展 d3 树布局以在最终节点提供 HTML 框

node.js - 表达式 eval ("function(x) { return x*x}") 破坏了 node.js 控制台