Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Asynchroniczna pętla, Rozważania nad API
Comandeer
post
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ą:
  • Czy oparcie bebechów tego czegoś na Promise.all/Promise brzmi sensownie?
  • Czy lepiej udostępnić userowi dostęp do obiecanki wewnątrz X.each i nie mieć kontroli nad tym, co zwróci całość, czy dać mu jedynie dostęp do done i w pełni kontrolować to, co zostanie zwrócone?
  • X.each czy X.forEachAsync? (IMG:style_emoticons/default/wink.gif) Chociaż pewnie każdy, kto pracował kiedyś z jQuery i tak wybierze 1. wersję
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
salfunglandyare
post
Post #2





Grupa: Zarejestrowani
Postów: 150
Pomógł: 31
Dołączył: 10.01.2007
Skąd: Bydgoszcz/Inowrocław

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


Rozumiem, ale done nie pojawi Ci się ot tak przy each czy foreach, jeśli robisz then w taki sposob, powinieneś również odpowiednio użyć done, inaczej wprowadzasz w blad. Niestety asynchroniczna synchroniczność na bazie promises w js to w dalszym ciagu callbacki na eventach w ladniejszym opakowaniu.
//edit: dodano "na eventach" powyzej
//edit2: poza tym wykonanie done w przypadku, który napisałeś to zupełnie co innego i jest troche oszukane (IMG:style_emoticons/default/tongue.gif) done w tym przypadku jest f-cja wewnetrzna wywolywana coprawda asynchronicznie, ale nie majaca wplywu na kontekst

Ten post edytował salfunglandyare 15.05.2015, 00:30:48
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 28.12.2025 - 12:33