Ale to nie wydaje się być właściwym sposobem na zrobienie tego.
To jest rzeczywiście właściwym sposobem, aby to zrobić (lub co najmniej na właściwy sposób to zrobić). Jest to kluczowy aspekt obietnic, są one potokiem, a dane mogą być masowane przez różne moduły obsługi w potoku.
Przykład:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("First handler", data);
return data.map(entry => entry * 10);
})
.then(data => {
console.log("Second handler", data);
});
( catch
moduł obsługi pominięty ze względu na zwięzłość. W kodzie produkcyjnym zawsze albo propaguj obietnicę, albo obsługuj odrzucenie).
Wynik, który widzimy z tego to:
Pierwsza osoba zajmująca się obsługą [1,2]
Drugi przewodnik [10,20]
... ponieważ pierwszy program obsługi otrzymuje rozdzielczość dwóch obietnic ( 1
i 2
) jako tablicę, a następnie tworzy nową tablicę z każdą z nich pomnożoną przez 10 i zwraca ją. Drugi program obsługi pobiera to, co zwrócił pierwszy program obsługi.
Jeśli dodatkowa praca, którą wykonujesz, jest synchroniczna, możesz również umieścić ją w pierwszym module obsługi:
Przykład:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("Initial data", data);
data = data.map(entry => entry * 10);
console.log("Updated data", data);
return data;
});
... ale jeśli jest asynchroniczny, nie chcesz tego robić, ponieważ kończy się zagnieżdżaniem, a zagnieżdżanie może szybko wymknąć się spod kontroli.
reject
uzyskanie wartości poPromise
funkcji początkowej ? A może wyrzucenie błędu gdziekolwiek w łańcuchu przeniesie Cię do.catch()
? Jeśli tak jest, jaki jest sens tegoreject
w pierwszej kolejności? Dlaczego po prostu nie wyrzucić błędu? Jeszcze raz dziękujęresolve
ireject
. Podczas obsługi , jeśli przetwarzanie nie powiedzie się, faktycznie zgłaszasz wyjątek, aby wyzwolić ścieżkę niepowodzenia. I tak, możesz również zgłosić wyjątek od pierwotnegoPromise
wywołania zwrotnego (zamiast używaćreject
), ale nie wszystkie awarie są wyjątkami.Twoje
return data
podejście jest poprawne, to przykład łączenia obietnic . Jeśli zwrócisz obietnicę z.then()
wywołania zwrotnego, JavaScript rozwiąże tę obietnicę i przekaże dane do następnegothen()
wywołania zwrotnego.Po prostu bądź ostrożny i upewnij się, że obsługujesz błędy z
.catch()
.Promise.all()
odrzuca, gdy tylko jedna z obietnic w tablicy zostanie odrzucona .źródło
Obecnie NodeJS obsługuje nową
async/await
składnię. Jest to prosta składnia i znacznie ułatwia życieasync function process(promises) { // must be an async function let x = await Promise.all(promises); // now x will be an array x = x.map( tmp => tmp * 10); // proccessing the data. } const promises = [ new Promise(resolve => setTimeout(resolve, 0, 1)), new Promise(resolve => setTimeout(resolve, 0, 2)) ]; process(promises)
Ucz się więcej:
źródło