C'è un modo per rompere l'esecuzione parallela dell'array di promesse con Promise.all [duplicato]

Aug 21 2020

Ho thread paralleli e desidero interrompere tutti i thread non completati quando uno di essi genera un errore. Ma sembra che tutti gli altri thread continuino ad essere eseguiti.

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';
}

Ottengo registro

0
Error
1
2
3
4
5
6
7
8
9

Quindi, quando genera un errore alla prima chiamata della funzione "worker" (con i = 0), viene rilevato dal blocco "catch" nella funzione "test". Quindi viene lanciato un errore alla funzione superiore, ma altri 9 lavoratori continuano a lavorare. C'è un modo per romperli? Vedo solo un modo: invoca process.exit in catch "block" nella funzione "test", ma interromperà tutto il programma invece della funzione corrente.

Risposte

2 pacocom Aug 21 2020 at 19:50

È necessario utilizzare Promise.race: il metodo Promise.race () restituisce una promessa che adempie o rifiuta non appena una delle promesse in un iterabile soddisfa o rifiuta, con il valore o il motivo di quella promessa.

Vedi altro https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race.