Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 1 268 Pomógł: 254 Dołączył: 11.06.2009 Skąd: Świętochłowice Ostrzeżenie: (0%)
|
Pytanie natury czysto teoretycznej. Załóżmy, że tworzę sobie API dla pewnego projektu X i musi być ono de facto w pełni asynchroniczne. Oczywistym wyborem są tutaj obiecanki - wszak nikt nie lubi się babrać w callbackach.
Wszystko jest cacy, ALE (IMG:style_emoticons/default/wink.gif) Potrzebna jest mi asynchroniczna wersja pętli [].forEach - metoda X.each (żeby się nikt nie rąbnął z natywnym [].forEach; chyba żeby iść w coś typu X.forEachAsync?). Na każdym elemencie mogą być wykonywane operacje asynchroniczne i pętla powinna "czekać". Na chłopski rozum implementacja powinna się opierać na Promise.all i każdy przepuszczany przez X.each element powinien być obiecanką. Tak na szybko "backend" czegoś takiego mógłby wyglądać np. tak (oczywiście pewnie będzie wyglądać ciut bardziej złożenie (IMG:style_emoticons/default/wink.gif) ): Kod var promises = []; pool.forEach(function(item) { var promise = toPromise(item); callback(promise); promises.push(promise); }); return Promises.all(promises); Zatem wywołanie X.each wyglądałoby następująco: Kod X.each(function(promise) { }) .then(function(returnValues) { //po pętelce }); User dostawałby po prostu dostęp do obiecanki - proste i przyjemne. Pojawia się jednak pewien problem: zaburza to koncepcję chainingu - przy takim wywołaniu nie dostaniemy pojedynczej wartości (a zatem mitycznego this) tylko tablicę dowolnych wartości (user może zwrócić wszystko w obiecance). W zależności od naszego widzimisię może to być dobrze lub źle (ale raczej źle). Stąd myślę czy nie ograniczyć możliwości usera wprowadzając pewien rodzaj nakładki, analogiczny do tego, jaką udostępniają np. taski asynchroniczne w Gruncie - user miałby dostęp tylko do funkcji done (z tym, że wówczas bebechy operowałyby raczej na pojedynczynm Promise a nie ich tablicy): Kod X.each(function(done) { done(); //wszystko cacy done(jakakolwiekWartosc); //coś się zepsuło }) .then(function(X) { //itd }); Tym sposobem w X.each().then na pewno uzyskamy z powrotem X, co np. w dalszej kolejności uprzyjemni obcowanie z biblioteką przy wykorzystywaniu generatorów. Pytania brzmią:
|
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 1 268 Pomógł: 254 Dołączył: 11.06.2009 Skąd: Świętochłowice Ostrzeżenie: (0%)
|
Dlatego wgl o tym done pomyślałem, żeby móc uruchamiać całość wewnątrz generatora, co by uprościło składnię do de facto minimum. Wówczas mielibyśmy prawie synchroniczny kod.
Owszem, done nie pojawi mi się od tak. Widzę to jako prostą funkcję, która resolvuje promise jeśli nic jej nie przekazaliśmy i rejectuje jeśli dostanie parametr. I funkcja ta byłaby przekazywana do pętli zamiast całej obiecanki. Co do wprowadzania w błąd - done nie jest częścią standardu obiecanek, więc nie bardzo wiem gdzie tu wprowadzanie w błąd? https://promisesaplus.com tą metodę wprowadza raptem kilka bibliotek + niekompatybilna ze standardem składnia jQuery. W natywnej implementacji obiecanek w ES6 metoda ta nie występuje, bo jedyne co robi to dubluje then |
|
|
|
Comandeer Asynchroniczna pętla 14.05.2015, 23:27:11
salfunglandyare To zależy jak wierzysz w obiecanki obiecanki-caca... 14.05.2015, 23:52:39
Comandeer CytatJa bym dał raczej dostęp na done, choć to nie... 15.05.2015, 00:00:35
salfunglandyare .....done(function(){
}); 15.05.2015, 00:06:47
Crozin Czyżbyś szukał czegoś takiego? http://stackoverflo... 15.05.2015, 00:07:01
Comandeer @salfunglandyare nie do końca o to chodzi. To, co... 15.05.2015, 00:20:00
salfunglandyare Rozumiem, ale done nie pojawi Ci się ot tak przy e... 15.05.2015, 00:25:36
salfunglandyare masz rację, ale to dlatego, że nie ma pomysłu do i... 15.05.2015, 00:48:28
Comandeer Z tym, że mówienie o obiecankach w kontekście jQue... 15.05.2015, 00:55:29
salfunglandyare widzisz, ja widzialbym w obiecankach then = done =... 15.05.2015, 01:10:25
Comandeer Nie bardzo rozumiem co mają promises do modelu zda... 15.05.2015, 07:29:52
by_ikar Osobiście do promises/deferred po stronie serwera ... 15.05.2015, 07:31:46
Comandeer Q znam, ale raczej zostanę przy natywnej implement... 15.05.2015, 07:39:18
by_ikar Cóż, jeżeli chodzi o wydajność, to tutaj są jakieś... 15.05.2015, 08:00:01
Comandeer Cóz, bluebird od dawna jest jedną z najszybszych i... 15.05.2015, 12:33:55 ![]() ![]() |
|
Aktualny czas: 31.12.2025 - 03:21 |