Promise.all [重複]を使用してpromiseの配列の並列実行を中断する方法はありますか

Aug 21 2020

並列スレッドがあり、そのうちの1つがエラーをスローしたときに、すべての未完了のスレッドを中断したいと思います。しかし、他のすべてのスレッドは引き続き実行されているようです。

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を呼び出す方法は1つしかありませんが、現在の関数ではなくすべてのプログラムが中断されます。

回答

2 pacocom Aug 21 2020 at 19:50

Promise.raceを使用する必要があります。Promise.race ()メソッドは、反復可能なpromiseの1つが満たされるか拒否されるとすぐに、そのpromiseの値または理由を使用して、promiseを返すか拒否します。

続きを見る https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race。