• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Projekt asynchronicznej pętli w JS [ankieta]

VPS Starter Arubacloud
+5 głosów
550 wizyt
pytanie zadane 17 maja 2015 w JavaScript przez Comandeer Guru (599,730 p.)

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 ;) 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 ;)):

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:

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):

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? ;) Chociaż pewnie każdy, kto pracował kiedyś z jQuery i tak wybierze 1. wersję

Dołączam krótką ankietę ze wszystkimi możliwościami i czekam na propozycje ;)

Możliwe odpowiedzi:
X.each + obiecanka (0 głosów)
X.each + done (1 głos, 17%)
X.forEachAsync + obiecanka (0 głosów)
X.forEachAsync + done (5 głosów, 83%)
inne rozwiązanie (0 głosów)
Ankieta zamknięta

1 odpowiedź

0 głosów
odpowiedź 13 sierpnia 2015 przez Rogal Obywatel (1,070 p.)
jezeli tworzysz API to wystawiasz jakis end-point , ktory nastepnie przechwytujesz metoda http i go obslugujesz. Promisy same w sobie stanowia swego rodzaju 'przeslanki', ktore mowia czy dana funckja moze sie wywolac lub nie. Jesli otrzymujesz tablice, to mozesz to przerobic w kazda stronie, dzielac tablice, wyciagajac z niej elementy, itp. itd. Ewentualnie jak potrzebujesz zrobic cos bardziej 'crazy' mozesz skorzystac z biblioteki lodash, ktora zawiera wiele przydatnych helperow w takich sprawach :)
1
komentarz 13 sierpnia 2015 przez Comandeer Guru (599,730 p.)
Problem polega na tym, że to nie jest API po HTTP. Piszę (pisałem…) bibliotekę do asynchronicznej obsługi DOM, gdzie de facto wszystko, oprócz inicjalnego pobrania elementu, leci przez obiecanki.

Stąd potrzebuję asynchronicznej pętli do operacji po de facto zbiorze promises. lodash mi tego nie umożliwia AFAIR - a nawet jeśli, to nie mam zamiaru uzależniać od niego swojej biblioteki ;)

Zresztą nie pytam o szczegóły implementacji, ale raczej o "publiczne API" takiej pętli. Bebechy już mam od dawna obmyślane i w sumie działa. W końcu może wrzucę core projektu na GH ;)

Podobne pytania

0 głosów
2 odpowiedzi 631 wizyt
pytanie zadane 18 sierpnia 2021 w JavaScript przez adek236 Nowicjusz (180 p.)
0 głosów
1 odpowiedź 479 wizyt
pytanie zadane 24 listopada 2019 w PHP przez Filipczak Gaduła (4,020 p.)
+1 głos
0 odpowiedzi 207 wizyt
pytanie zadane 11 marca 2020 w C# przez kubekszklany Gaduła (3,170 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...