Jakie są różnice między odroczonymi, obietnicami i kontraktami terminowymi?
Czy kryje się za tym ogólnie przyjęta teoria?
Jakie są różnice między odroczonymi, obietnicami i kontraktami terminowymi?
Czy kryje się za tym ogólnie przyjęta teoria?
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:
Zamiast bezpośrednio przekazywać wywołania zwrotne do funkcji, co może prowadzić do ściśle powiązanych interfejsów, użycie obietnic pozwala rozdzielić obawy dotyczące kodu synchronicznego lub asynchronicznego.
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 ):
/* assume getScript has signature like: function (path, callback, context)
and listens to onload && onreadystatechange */
$(function () {
getScript('path/to/CodeMirror', getJSMode);
// onreadystate is not reliable for callback args.
function getJSMode() {
getScript('path/to/CodeMirror/mode/javascript/javascript.js',
ourAwesomeScript);
};
function ourAwesomeScript() {
console.log("CodeMirror is awesome, but I'm too impatient.");
};
});
Do sformułowanej wersji obietnic (ponownie przepraszam, nie jestem na bieżąco z jQuery):
/* Assume getScript returns a promise object */
$(function () {
$.when(
getScript('path/to/CodeMirror'),
getScript('path/to/CodeMirror/mode/javascript/javascript.js')
).then(function () {
console.log("CodeMirror is awesome, but I'm too impatient.");
});
});
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.
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 .
7
then
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 :
> asyncComputeTheAnswerToEverything()
.then(addTwo)
.then(printResult);
44
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)
Różnica między obietnicami / A a obietnicami / A +
(TL; DR, Obietnice / A + najczęściej rozwiązują niejednoznaczności w Obietnicach / A)
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:
Chodzi o to, aby przywrócić nam funkcjonalną kompozycję i bąbelki błędów w świecie asynchronicznym.
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:
getTweetsFor("domenic") // promise-returning async function
.then(function (tweets) {
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
})
.then(doHttpRequest) // promise-returning async function
.then(
function (responseBody) {
console.log("Most recent link text:", responseBody);
},
function (error) {
console.error("Error with the twitterverse:", error);
}
);
Działa tak, jakbyś pisał ten kod synchroniczny:
try {
var tweets = getTweetsFor("domenic"); // blocking
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
console.log("Most recent link text:", responseBody);
} catch (error) {
console.error("Error with the twitterverse: ", error);
}
(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:
Chcę, żebyś zapamiętał to zdanie: obietnica jest wartością asynchroniczną .
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).
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.
Po prostu możemy powiedzieć, że Obietnica reprezentuje wartość, która nie jest jeszcze znana, a jako Odroczona oznacza pracę, która nie została jeszcze ukończona.
promise
oznacza wartość, która nie jest jeszcze znana deferred
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