Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Promise.done()
Skie
post
Post #1





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował Skie 8.10.2015, 17:44:57


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
by_ikar
post
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Comandeer
post
Post #3





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


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)


--------------------
Go to the top of the page
+Quote Post
Skie
post
Post #4





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


@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.

Ten post edytował Skie 9.10.2015, 20:04:30


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
by_ikar
post
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Comandeer
post
Post #6





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


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+…


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 04:03