3

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

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”块捕获。然后和错误被抛出到上层函数,但其​​他 9 个工人仍然继续工作。有什么办法可以打破它们吗?我只看到一种方法-在函数“test”中的catch“block”中调用process.exit,但它会中断所有程序而不是当前函数。

4

1 回答 1

2

您应该使用 Promise.race: Promise.race() 方法返回一个承诺,一旦可迭代中的一个承诺履行或拒绝,该承诺就会履行或拒绝,并带有来自该承诺的价值或原因。

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

于 2020-08-21T12:50:33.693 回答