Widziałem kod, który wygląda następująco:
myObj.doSome("task").then(function(env) {
// logic
});
Skąd then()
pochodzi?
javascript
Kay Pale
źródło
źródło
Odpowiedzi:
Tradycyjnym sposobem radzenia sobie z wywołaniami asynchronicznymi w JavaScript są wywołania zwrotne. Powiedzmy, że musieliśmy wykonać trzy połączenia z serwerem, jeden po drugim, aby skonfigurować naszą aplikację. W przypadku wywołań zwrotnych kod może wyglądać mniej więcej tak (przy założeniu funkcji xhrGET do wywołania serwera):
W tym przykładzie najpierw pobieramy konfigurację serwera. Następnie na tej podstawie pobieramy informacje o bieżącym użytkowniku, a następnie w końcu otrzymujemy listę elementów dla bieżącego użytkownika. Każde wywołanie xhrGET przyjmuje funkcję zwrotną, która jest wykonywana, gdy serwer odpowiada.
Oczywiście, im więcej poziomów zagnieżdżania mamy, tym trudniej jest czytać, debugować, utrzymywać, aktualizować i zasadniczo pracować z kodem. Jest to ogólnie znane jako piekło zwrotne. Ponadto, jeśli potrzebowaliśmy obsługiwać błędy, musimy przekazać inną funkcję do każdego wywołania xhrGET, aby powiedzieć mu, co należy zrobić w przypadku błędu. Jeśli chcielibyśmy mieć tylko jedną wspólną procedurę obsługi błędów, nie jest to możliwe.
Promise API proponuje następujące opcje:
promise
obiekt.promise
obiekt będzie miałthen
funkcję, która może przyjąć dwa argumenty,success
moduł obsługi ierror
moduł obsługi.then
funkcji zostanie wywołana tylko raz , po zakończeniu zadania asynchronicznego.then
Funkcja będzie również zwrócipromise
, w celu umożliwienia łączenia wielu połączeń.value
, który zostanie przekazany do następnej funkcji jakoargument
, w łańcuchupromise
s.promise
(wykonuje kolejne żądanie asynchroniczne), następny moduł obsługi (sukces lub błąd) zostanie wywołany dopiero po zakończeniu tego żądania.Tak więc poprzedni przykładowy kod może zostać przetłumaczony na coś takiego, jak przy użyciu obietnic i
$http
usługi (w AngularJs):Propagowanie sukcesu i błędu
Łańcuchowe obietnice to bardzo potężna technika, która pozwala nam osiągnąć wiele funkcji, takich jak wykonanie połączenia z serwerem, wykonanie częściowego przetwarzania danych, a następnie zwrócenie przetworzonych danych do kontrolera. Ale kiedy pracujemy z
promise
łańcuchami, musimy pamiętać o kilku rzeczach.Rozważ następujący hipotetyczny
promise
łańcuch z trzema obietnicami, P1, P2 i P3. Każdypromise
ma moduł obsługi sukcesu i moduł obsługi błędów, więc S1 i E1 dla P1, S2 i E2 dla P2 oraz S3 i E3 dla P3:W normalnym przepływie rzeczy, gdzie nie ma błędów, aplikacja przepływałaby przez S1, S2, a na końcu S3. Ale w prawdziwym życiu rzeczy nigdy nie są tak płynne. P1 może napotkać błąd lub P2 może napotkać błąd, wyzwalając E1 lub E2.
Rozważ następujące przypadki:
• Otrzymujemy pozytywną odpowiedź z serwera w P1, ale zwrócone dane są niepoprawne lub brak danych na serwerze (pomyśl pusta tablica). W takim przypadku, dla następnej obietnicy P2, powinna ona uruchomić moduł obsługi błędów E2.
• Otrzymujemy błąd dla obietnicy P2, wyzwalający E2. Ale w module obsługi mamy dane z pamięci podręcznej, co zapewnia, że aplikacja może załadować się normalnie. W takim przypadku możemy chcieć upewnić się, że po E2 wywoływana jest S3.
Tak więc za każdym razem, gdy piszemy komunikat o sukcesie lub procedurze obsługi błędów, musimy wykonać połączenie - biorąc pod uwagę naszą obecną funkcję, czy ta obietnica jest sukcesem czy porażką następnego programu obsługi w łańcuchu obietnic?
Jeśli chcemy uruchomić procedurę obsługi sukcesu dla następnej obietnicy w łańcuchu, możemy po prostu zwrócić wartość z procedury sukcesu lub procedury obsługi błędów
Jeśli natomiast chcemy uruchomić moduł obsługi błędów dla następnej obietnicy w łańcuchu, możemy to zrobić za pomocą
deferred
obiektu i wywołania jegoreject()
metodyOdroczone obiekty w Jquery: https://api.jquery.com/jquery.deferred/
Odroczone obiekty w AngularJs: https://docs.angularjs.org/api/ng/service/ $ q
źródło
funkcja then () jest związana z „obietnicami Javascript” używanymi w niektórych bibliotekach lub frameworkach, takich jak jQuery lub AngularJS.
Obietnica jest wzorcem do obsługi operacji asynchronicznych. Obietnica umożliwia wywołanie metody o nazwie „następnie”, która umożliwia określenie funkcji, które mają być używane jako wywołania zwrotne.
Aby uzyskać więcej informacji, zobacz: http://wildermuth.com/2013/8/3/JavaScript_Promises
A dla obietnic Angular: http://liamkaufman.com/blog/2013/09/09/using-angularjs-promises/
źródło
A promise can only succeed or fail once
iIf a promise has succeeded or failed and you later add a success/failure callback, the correct callback will be called
promise
i co można zrobićcallback
Według mojej wiedzy, nie ma wbudowanej
then()
metody wjavascript
(w momencie pisania tego tekstu).Wygląda na to, że cokolwiek
doSome("task")
zwraca, ma metodę o nazwiethen
.Jeśli zarejestrujesz wynik powrotu
doSome()
do konsoli, powinieneś być w stanie zobaczyć właściwości tego, co zostało zwrócone.AKTUALIZACJA (od ECMAScript6) : -
.then()
Funkcja została włączona do czystego javascript.Z dokumentacji Mozilli tutaj ,
Z kolei obiekt Promise jest zdefiniowany jako
Oznacza to, że
Promise
działa jako symbol zastępczy dla wartości, która nie została jeszcze obliczona, ale zostanie rozwiązana w przyszłości. I.then()
funkcja służy do kojarzenia funkcji, które mają zostać wywołane w Obietnicy po jej rozwiązaniu - jako sukces lub porażka.źródło
.then
Wtedy nie było wbudowanego , ale natywne obietnice nadchodzą teraz w ES6: html5rocks.com/en/tutorials/es6/promisesOto rzecz, którą sobie stworzyłem, aby wyjaśnić, jak działają rzeczy. Sądzę, że inni też mogą uznać ten konkretny przykład za użyteczny:
źródło
Oto mały JS_Fiddle.
to jest stos wywołania zwrotnego metody, który jest dostępny po rozwiązaniu obietnicy, jest częścią biblioteki takiej jak jQuery, ale teraz jest dostępny w natywnym JavaScript, a poniżej znajduje się szczegółowe wyjaśnienie, jak to działa
Możesz zrobić obietnicę w natywnym JavaScript: tak jak w jQuery są obietnice, każda obietnica może być układana w stos, a następnie może być wywoływana z wywołaniami zwrotnymi Resolve i Reject, w ten sposób możesz łączyć asynchroniczne wywołania.
Rozwidlałem i edytowałem z MSDN Docs na temat stanu ładowania baterii.
Spróbuje dowiedzieć się, czy użytkownik laptopa lub urządzenia ładuje baterię. jest wywoływany i możesz odnieść sukces w pracy.
Kolejny przykład es6
źródło
then
pochodzi i jak działa. Powinieneś poprawić swoją odpowiedź, aby podać te szczegóły.Podejrzewam, że doSome zwraca to, co jest myObj, która również ma metodę then. Standardowe łączenie metod ...
jeśli doSome nie zwraca tego, będąc obiektem, na którym wykonano doSome, bądź pewien, że zwraca jakiś obiekt za pomocą metody then ...
jak wskazuje @patrick, nie ma metody then () dla standardowego js
źródło
doSome („zadanie”) musi zwracać obiekt obietnicy, a obietnica ta zawsze ma funkcję wtedy. Twój kod jest taki jak ten
i wiesz, że jest to zwykłe wywołanie funkcji członka.
źródło
.then
zwraca obietnicę w funkcji asynchronicznej.Dobrym przykładem byłoby:
Aby dodać do niego kolejną logikę, możesz także dodać
reject('I am the rejected param')
wywołanie funkcji i console.log.źródło
W tym przypadku
then()
jest metoda klasowa obiektu zwrócona przezdoSome()
metodę.źródło
Funkcja „.then ()” jest szeroko stosowana dla obiecanych obiektów w programowaniu Asynchoronus dla aplikacji Windows 8 Store. O ile rozumiem, działa to jak połączenie zwrotne.
Znajdź szczegóły w tej dokumentacji http://msdn.microsoft.com/en-us/library/windows/apps/hh700330.aspx
Przyczyną może być również nazwa każdej innej zdefiniowanej funkcji.
źródło
Inny przykład:
Ta sama logika przy użyciu skrótów funkcji strzałek:
źródło
Spóźniłem się około 8 lat, cóż ... tak czy inaczej, tak naprawdę nie wiem, co wtedy () robi, ale może MDN może mieć odpowiedź. Właściwie mógłbym to trochę zrozumieć.
Spowoduje to wyświetlenie wszystkich potrzebnych informacji (mam nadzieję). Chyba że ktoś już opublikował ten link. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
Format to promise.prototype.then () Obietnica i prototyp są jakby podobnymi zmiennymi, ale nie podobnymi zmiennymi w javascript, mam na myśli, że inne rzeczy idą tam jak navigator.getBattery (). Then (), gdzie to istnieje, ale jest ledwo używany w sieci, ten pokazuje status baterii urządzenia, więcej informacji i więcej na MDN, jeśli jesteś ciekawy.
źródło