Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Promise.done()
Forum PHP.pl > Forum > Po stronie przeglądarki
Skie
Witam,
właśnie powoli odkrywam świat Promisów w JS, ale nie potrafię zrozumieć po co w API większości bibliotek Promise jest metoda done()? Ja rozumiem, że then() połyka zwracane wartości i błędy, a done() z kolei wszystko wyrzuca na zewnątrz do przetworzenia poza Promise, i rozumiem też zasadę "return Promise or call .done() on it", ale po co osobna funkcja do tego? Każdy chain Promisów gdzieś się kończy, czemu ostatni then() w tym chainie w momencie zmiany statusu z PENDING na FULFILLED lub REJECTED po prostu nie zachowuje się automatycznie jak to co robi teraz done()? W ten sposób byloby mniej problemów z używaniem then() vs done(), no i kod byłby bardziej reużywalny, bo łączenie promisów można byłoby robić out-of-the-box zamiast bawić się helperami.

Może ktoś mi to rozjaśnić?
by_ikar
Bo nie ma done w specyfikacji, done jest fanaberią bodajże jQuery, które używało done dla statusu jqXHR.done lub jqXHR.success.
Comandeer
Dokładnie - polecam poczytać o standardzie A+ https://promisesaplus.com/ na którym opiera się natywna implementacja obiecanek w ES6 (window.Promise). Prawdę mówiąc nigdy nie miałem potrzeby korzystania z czegokolwiek poza then w obiecankach - starcza do wszystkiego (a zwłaszcza chainowania obiecanek)
Skie
@by_ikar
Metoda done() w przypadku jQuery z tego co pamiętam to po prostu metoda bindowania callbacka onFulfilled do ich implementacji Promisów, czyli odpowiednik metod typu success() / complete() analogicznych bibliotek, a nie done(), o które pytam.

@Comandeer
Specyfikację znam, ale wiedząc jak się ma teoria do rzeczywistej implementacji potrzebowałem opinii kogoś kto ich dużo używał w swoich projektach. Większosć bibliotek - Bluebird v1, Promisejs, CommonJS, ReactPromise i inne - wszędzie pchają te done(). Tak jak myślałem jest to zbędne, dzięki.
by_ikar
Cytat(Skie @ 9.10.2015, 21:00:22 ) *
@by_ikar
Metoda done() w przypadku jQuery z tego co pamiętam to po prostu metoda bindowania callbacka onFulfilled do ich implementacji Promisów, czyli odpowiednik metod typu success() / complete() analogicznych bibliotek, a nie done(), o które pytam.

@Comandeer
Specyfikację znam, ale wiedząc jak się ma teoria do rzeczywistej implementacji potrzebowałem opinii kogoś kto ich dużo używał w swoich projektach. Większosć bibliotek - Bluebird v1, Promisejs, CommonJS, ReactPromise i inne - wszędzie pchają te done(). Tak jak myślałem jest to zbędne, dzięki.


Właśnie done jest aliasem succes w przypadku jquery i ajaxa:

Cytat
jqXHR.done(function( data, textStatus, jqXHR ) {});
An alternative construct to the success callback option, the .done() method replaces the deprecated jqXHR.success() method. Refer to deferred.done() for implementation details.


źródło: http://api.jquery.com/jquery.ajax/#jqXHR

Dlatego mówię że to jest fanaberia jquery, a nie samego promise, które w swojej specyfikacji nie ma czegoś takiego jak done. Niestety za jquery poszło kilka innych libów, w których też to done jest zaimplementowane, efektem czego jest właśnie chociażby ten wątek. Warto szukać nie tyle co popularnych libów, co tych które są implementacją specyfikacji, jak np: https://github.com/kevinconway/Deferred.js
Comandeer
De facto, jeśli nie potrzebuje się wsparcia IE, można skorzystać z natywnego Promise: http://caniuse.com/#feat=promises
No i takie Q czy Bluebird są zgodne ze standardem A+ i dodatkowo dodają np done (są supersetem A+) → https://promisesaplus.com/implementations - inna rzecz, że IMO to done potrzebne nie jest.

Problem z jQuery jest inny: obiecanki aż do wersji 3 po prostu nie są zgodne ze standardem A+…
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.