Jakie są różnice między odroczonymi, obietnicami i kontraktami terminowymi?
Czy kryje się za tym ogólnie przyjęta teoria?
javascript
promise
future
deferred
Wieża
źródło
źródło
Odpowiedzi:
W świetle pozornej niechęci do tego, jak próbowałem odpowiedzieć na pytanie OP. Dosłowna odpowiedź brzmi: obietnica jest czymś współdzielonym z innymi przedmiotami, a odroczona powinna być prywatna. Przede wszystkim odroczona (która zasadniczo przedłuża Obietnicę) może rozwiązać się sama, podczas gdy obietnica może nie być w stanie tego zrobić.
Jeśli interesują Cię drobiazgi, sprawdź Promises / A + .
O ile mi wiadomo, nadrzędnym celem jest poprawienie przejrzystości i poluzowanie sprzężenia poprzez ustandaryzowany interfejs. Zobacz sugerowaną lekturę od @ jfriend00:
Osobiście uważam, że odroczenie jest szczególnie przydatne, gdy zajmujemy się np. Szablonami wypełnionymi żądaniami asynchronicznymi, ładowaniem skryptów zawierających sieci zależności i dostarczaniem opinii użytkowników w celu tworzenia danych w sposób nie blokujący.
Rzeczywiście, porównaj czystej postaci zwrotnej robienia czegoś po załadowaniu CodeMirror w trybie JS asynchronicznie (przeprosiny, nie używałem jQuery w czasie ):
Do sformułowanej wersji obietnic (ponownie przepraszam, nie jestem na bieżąco z jQuery):
Przepraszamy za częściowo pseudo-kod, ale mam nadzieję, że wyjaśnia on nieco ideę. Zasadniczo, zwracając znormalizowaną obietnicę, możesz ją przekazać, umożliwiając w ten sposób wyraźniejsze grupowanie.
źródło
fn(callback, errback)
nie jest ściślej związany ani mniej przydatny niżfn().then(callback, errback)
- ale i tak jest to zły sposób na stosowanie obietnic. Szczególnie nienawidzę$.when
przykładu kultu ładunku - nie ma absolutnie żadnego powodu, dla którego nie można mieć$.when
funkcji, która działała z wywołaniami zwrotnymi.Odpowiedzi te, w tym wybranego odpowiedzi są dobre dla wprowadzenia obietnic koncepcyjnie, ale brakuje w specyfice co dokładnie są różnice w terminologii, która powstaje przy użyciu bibliotek ich realizacji (i nie są istotne różnice).
Ponieważ wciąż jest to rozwijająca się specyfikacja , odpowiedź pochodzi obecnie z próby zbadania zarówno referencji (jak wikipedia ), jak i implementacji (jak jQuery ):
Odroczony : nigdy nie opisany w popularnych odniesieniach, 1 2 3 4, ale powszechnie stosowany przez implementacje jako arbiter rozwiązywania obietnic (wdrażanie i ). 5 6 7
resolve
reject
Czasami deferreds są również obietnice (wykonawcze
then
), 5 6 inne czasy to postrzegane jako bardziej czysta, że odroczonego zdolne tylko rozdzielczości, i zmuszając użytkownika do dostępu obietnicę korzystania . 7then
Obietnica : najbardziej wszechstronne słowo na temat omawianej strategii.
Obiekt proxy przechowujący wynik funkcji docelowej, którego synchroniczność chcielibyśmy wyodrębnić, a także ujawniający
then
funkcję akceptującą inną funkcję docelową i zwracającą nową obietnicę. 2)Przykład z CommonJS :
Zawsze opisywane w popularnych źródłach, choć nigdy nie określane, do kogo należy odpowiedzialność. 1 2 3 4
Zawsze obecny w popularnych implementacjach i nigdy nie posiadający zdolności rozdzielczości. 5 6 7
Przyszłość : pozornie przestarzały termin znaleziony w niektórych popularnych odnośnikach 1 i co najmniej jednym popularnym wykonaniu 8, ale pozornie wycofywany z dyskusji zamiast terminu „obietnica” 3 i nie zawsze wymieniany w popularnych wprowadzeniach do tematu. 9
Jednak co najmniej jedna biblioteka używa tego terminu w sposób ogólny, aby wyodrębnić synchroniczność i obsługę błędów, nie zapewniając jednak
then
funkcjonalności. 10 Nie jest jasne, czy unikanie terminu „obietnica” było zamierzone, ale prawdopodobnie jest to dobry wybór, ponieważ obietnice budowane są wokół „rzeczy niemożliwych”. 2)Bibliografia
Różne potencjalnie mylące rzeczy
Różnica między obietnicami / A a obietnicami / A +
(TL; DR, Obietnice / A + najczęściej rozwiązują niejednoznaczności w Obietnicach / A)
źródło
Task
To, co naprawdę sprawiło, że kliknęło mnie to, to prezentacja Domenica Denicoli.
W githubist podał opis, który najbardziej mi się podoba, jest bardzo zwięzły:
Innymi słowy, obietnice są sposobem, który pozwala nam pisać kod asynchroniczny, który jest prawie tak łatwy do napisania, jak gdyby był synchroniczny .
Rozważ ten przykład z obietnicami:
Działa tak, jakbyś pisał ten kod synchroniczny:
(Jeśli nadal wydaje się to skomplikowane, obejrzyj prezentację!)
Jeśli chodzi o odroczony, jest to droga do
.resolve()
lub.reject()
obiecuje. W specyfikacji Promises / B nazywa się to.defer()
. W jQuery to jest$.Deferred()
.Należy pamiętać, że o ile wiem, implementacja Promise w jQuery jest zepsuta (zobacz tę treść), przynajmniej od jQuery 1.8.2.
Podobno implementuje obietnice / annables , ale nie otrzymujesz poprawnej obsługi błędów, którą powinieneś, w tym sensie, że cała funkcja „asynchronizuj / łap” nie będzie działać. Szkoda, bo „try / catch” z kodem asynchronicznym jest całkowicie fajne.
Jeśli zamierzasz skorzystać z Obietnic (powinieneś wypróbować je z własnym kodem!), Użyj Q Kris Kowal . Wersja jQuery to tylko agregator zwrotny do pisania czystszego kodu jQuery, ale nie ma sensu.
Jeśli chodzi o przyszłość, nie mam pojęcia, nie widziałem tego w żadnym interfejsie API.
Edytuj: Dyskusja youtube Domenica Denicoli na temat obietnic z komentarza @Farm poniżej.
Cytat z Michaela Jacksona (tak, Michael Jackson ) z filmu:
To doskonały opis: obietnica jest jak zmienna z przyszłości - pierwszorzędne odniesienie do czegoś, co w pewnym momencie będzie istnieć (lub się wydarzy).
źródło
Obietnica reprezentuje pełnomocnik do wartości niekoniecznie wiadomo, kiedy obietnica jest tworzony. Pozwala powiązać procedury obsługi z ostateczną wartością sukcesu lub przyczyną niepowodzenia akcji asynchronicznej. Dzięki temu metody asynchroniczne zwracają wartości, takie jak metody synchroniczne: zamiast wartości końcowej metoda asynchroniczna zwraca obietnicę posiadania wartości w pewnym momencie w przyszłości.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
deferred.promise()
Metoda umożliwia funkcja asynchroniczna, aby zapobiec zakłócaniu inny kod z postępem lub status swojego wniosku wewnętrznego. Obietnica ujawnia tylko odroczone metody potrzebne do dołączenia dodatkowych procedur obsługi lub określenia stanu ( wtedy zakończone, niepowodzenie, zawsze, potok, postęp, stan i obietnica ), ale nie te, które zmieniają stan ( rozwiązują, odrzucają, powiadamiają, rozwiązują, odrzucić i powiadomić ).Jeśli podano obiekt docelowy,
deferred.promise()
dołączymy do niego metody, a następnie zwrócą ten obiekt, zamiast tworzyć nowy. Może to być przydatne do dołączenia zachowania Promise do obiektu, który już istnieje.Jeśli tworzysz Odroczony, zachowaj odniesienie do Odroczonego, aby w pewnym momencie można go było rozwiązać lub odrzucić. Zwracaj tylko obiekt Promise przez deferred.promise (), aby inny kod mógł rejestrować wywołania zwrotne lub sprawdzać bieżący stan.
źródło
promise
oznacza wartość, która nie jest jeszcze znanadeferred
Oznacza pracę, która nie jest jeszcze gotowyObietnica jest symbolem zastępczym dla wyniku, który początkowo jest nieznany, a odroczona reprezentuje obliczenie, które daje wartość.
Odniesienie
źródło