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ę