Promise.all [duplicate]로 프라 미스 배열의 병렬 실행을 중단하는 방법입니다.

Aug 21 2020

병렬 스레드가 있으며 그중 하나에서 오류가 발생하면 완료되지 않은 모든 스레드를 중단하고 싶습니다. 그러나 다른 모든 스레드는 계속 실행되는 것 같습니다.

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를 호출하지만 현재 함수 대신 모든 프로그램을 중단합니다.

답변

2 pacocom Aug 21 2020 at 19:50

Promise.race를 사용해야합니다 . Promise.race () 메서드는 이터 러블의 약속 중 하나가 해당 약속의 값 또는 이유를 충족하거나 거부하는 즉시 충족하거나 거부하는 약속을 반환합니다.

더보기 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race.