Patrzę na ten przykład z dokumentacji Angulara dla, $q
ale myślę, że prawdopodobnie dotyczy to ogólnie obietnic. Poniższy przykład jest dosłownie skopiowany z ich dokumentów z dołączonym komentarzem:
promiseB = promiseA.then(function(result) {
return result + 1;
});
// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1
Nie wiem, jak to działa. Jeśli mogę odwołać .then()
się do wyniku pierwszego .then()
, powiązania ich w łańcuch, o którym wiem, że mogę, to promiseB
jest to obiekt obietnicy, typu Object
. To nie jest Number
. Więc co mają na myśli, mówiąc „jego wartość będzie wynikiem obietnicy A zwiększonej o 1”?
Czy mam uzyskać do tego dostęp jako promiseB.value
czy coś takiego? W jaki sposób pomyślne wywołanie zwrotne może zwrócić obietnicę ORAZ zwrócić „wynik + 1”? Coś mi brakuje.
javascript
angularjs
promise
angular-promise
nazwa_użytkownika_tymczasowego
źródło
źródło
Odpowiedzi:
promiseA
„sthen
funkcja zwraca nową obietnicę (promiseB
), która jest natychmiast po rozwiązanypromiseA
został rozwiązany, jego wartość jest wartością z co jest zwracane z funkcji sukcesu wewnątrzpromiseA
.W tym przypadku
promiseA
jest rozwiązywany z wartością -result
a następnie natychmiast rozwiązuje siępromiseB
z wartościąresult + 1
.Dostęp do wartości
promiseB
jest wykonywany w taki sam sposób, w jaki uzyskaliśmy dostęp do wynikupromiseA
.Edycja grudnia 2019 :
async
/await
jest teraz standardem w JS, co pozwala na alternatywną składnię do podejścia opisanego powyżej. Możesz teraz napisać:Teraz nie ma obietnicyB, ponieważ rozpakowaliśmy wynik z użycia promiseA
await
i możesz z nim bezpośrednio pracować.Jednak
await
można go używać tylko wewnątrzasync
funkcji. Więc aby nieco pomniejszyć, powyższe musiało być zawarte w następujący sposób:źródło
Kiedy obietnica zostanie rozwiązana / odrzucona, wywoła swoją procedurę obsługi sukcesu / błędu:
then
Metoda zwraca również obietnicę: promiseB, które zostaną rozwiązane / odrzucone w zależności od wartości powrotnej z obsługi sukcesu / błędu z promiseA .Istnieją trzy możliwe wartości, które mogą zwrócić procedury obsługi sukcesu / błędu obietnicy A, które wpłyną na wynik promiseB:
Uzbrojeni w to zrozumienie, możesz zrozumieć następujące kwestie:
Następnie wywołanie natychmiast zwraca promiseB. Gdy obietnica A zostanie rozwiązana, przekazuje wynik do programu obsługi sukcesu obietnicy A. Ponieważ wartość zwracana jest wynikiem promiseA + 1, procedura obsługi sukcesu zwraca wartość (opcja 2 powyżej), więc promiseB rozwiąże problem natychmiast, a program obsługi sukcesu promiseB otrzyma wynik promiseA + 1.
źródło
.then
function of promiseB otrzymuje to, co jest zwracane z.then
funkcji promiseA.tutaj zwraca promiseA jest liczbą, która będzie dostępna jako
number
parametr w funkcji sukcesu promiseB. który następnie zostanie zwiększony o 1źródło
Analiza komentarza nieco inaczej niż w obecnym rozumieniu może pomóc:
Stanowi, że
promiseB
jest to obietnica, ale zostanie rozwiązana natychmiast popromiseA
rozwiązaniu. Z innego punktu widzenia oznacza to, żepromiseA.then()
zwraca obietnicę, do której jest przypisanapromiseB
.Oznacza to, że wartość, która
promiseA
została rozwiązana, jest wartością,promiseB
która otrzyma jako wartość successCallback:źródło
Odpowiedź pixelbits jest poprawna i zawsze powinieneś jej używać,
.then()
aby uzyskać dostęp do wartości obietnicy w kodzie produkcyjnym.Istnieje jednak sposób, aby uzyskać dostęp do wartości obietnicy bezpośrednio po jej rozwiązaniu przy użyciu następującego nieobsługiwanego wewnętrznego powiązania node.js:
OSTRZEŻENIE: process.binding nigdy nie miał być używany poza rdzeniem nodejs, a główny zespół nodejs aktywnie stara się go wycofać
https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064
źródło
Ten przykład wydaje mi się oczywisty. Zwróć uwagę, jak czekasz na wynik, a więc przegapisz zwrot Obietnicy.
źródło
źródło
Możesz to łatwo zrobić za pomocą metody oczekiwania asynchronicznego w javascript.
Poniżej znajduje się przykład pobierania wartości obietnicy WebRTC przy użyciu limitu czasu.
źródło
W Node REPL, aby uzyskać połączenie DB, które było wartością obietnicy, przyjąłem następujące podejście:
Linia z
await
normalnie zwróciłaby obietnicę. Ten kod można wkleić do Node REPL lub, jeśli jest windex.js
nim zapisany , można go uruchomić w Bash zco pozostawia Cię w Node REPL po uruchomieniu skryptu z dostępem do ustawionej zmiennej. Aby potwierdzić, że funkcja asynchroniczna zwróciła, możesz
connection
na przykład zarejestrować, a następnie możesz użyć zmiennej. Oczywiście nie chciałoby się liczyć na to, że funkcja asynchroniczna zostanie jeszcze rozwiązana dla dowolnego kodu w skrypcie poza funkcją asynchroniczną.źródło
Powyżej jest kilka dobrych odpowiedzi, a tutaj jest wersja funkcji ES6 Arrow
źródło
Jestem powolnym uczniem obietnic javascript, domyślnie wszystkie funkcje asynchroniczne zwracają obietnicę, możesz opakować swój wynik jako:
„ Wyrażenie await powoduje wstrzymanie wykonywania funkcji asynchronicznej do czasu rozliczenia Obietnicy (czyli wypełnienia lub odrzucenia) i wznowienie wykonywania funkcji asynchronicznej po spełnieniu. Po wznowieniu wartość wyrażenia await odpowiada wypełnionej Obietnicy . Jeśli obietnica zostanie odrzucona, wyrażenie await rzuca odrzuconą wartość . "
Przeczytaj więcej o oczekiwaniach i obietnicach w MDN Web Docs
źródło
Może ten mały przykład kodu Typescript pomoże.
Tutaj
repository.get(id)
zwraca aPromise<Account>
. Przypisuję to zmiennejaccount
wthen
instrukcji.źródło