2015-07-15 11 views
24

Mam pętlę, która wywołuje metodę, która robi rzeczy asynchornously. Ta pętla może wielokrotnie wywoływać tę metodę. Po tej pętli mam kolejną pętlę, która musi być wykonana tylko wtedy, gdy wszystkie asynchroniczne rzeczy są zrobione. Więc to ilustruje moje pragnienia:Jak zwrócić wiele obietnic w pętli i czekać, aż wszyscy zrobią inne rzeczy

for(i=0;i<5;i++){ 
    doSomeAsyncStuff();  
} 

for(i=0;i<5;i++){ 
    doSomeStuffOnlyWhenTheAsyncStuffIsFinish();  
} 

Nie znam tak wiele obietnic, więc czy ktoś mógłby mi pomóc to osiągnąć?

To jest jak moja doSomeAsyncStuff() zachowywać:

doSomeAsyncStuff{ 
    var editor = generateCKEditor(); 
    editor.on('instanceReady',function(evt){ 
     doSomeStuff(); 
     // There should be the resolve() of the promises I think. 
    }) 
} 

Może muszę zrobić coś takiego:

doSomeAsyncStuff{ 
    var editor = generateCKEditor(); 
    return new Promises(function(resolve,refuse){ 
     editor.on('instanceReady',function(evt){ 
      doSomeStuff(); 
      resolve(true); 
     }) 
    } 
} 

Ale nie jestem pewien składni.

+0

Czy kontrolujesz połączenia asynchroniczne? Czy już zwrócą obietnice, czy może zwrócisz im obietnice? –

+0

Czym dokładnie jest ta sekwencja? Czy chcesz wywołać inne funkcje po zakończeniu * wszystkich * poprzednich asynchronicznych? A może potrzebujesz wywołać funkcję po zakończeniu każdego asynchronizacji? – Sosdoc

+0

Na razie pierwsza funkcja nie zwraca obietnic. Muszę to wdrożyć. Chcę edytować moją wiadomość, aby dodać kilka szczegółów dotyczących przepływu pracy moich funkcji. I tak, potrzebuję, aby wszystkie rzeczy pierwszej pętli zostały zakończone przed rozpoczęciem wykonywania rzeczy w drugiej pętli. – Ganbin

Odpowiedz

43

Można użyć Promise.all (spec, MDN) za to: Akceptuje kilka indywidualnych obietnic i daje z powrotem jedną obietnicę, że zostanie rozwiązany, gdy wszystkie te, które dałeś to są rozwiązane lub odrzucone, gdy którykolwiek z nich jest odrzucony.

Więc jeśli uczynić doSomeAsyncStuff zwrot obietnica, następnie:

var promises = []; 

for(i=0;i<5;i+){ 
    promises.push(doSomeAsyncStuff()); 
} 

Promise.all(promises) 
    .then(() => { 
     for(i=0;i<5;i+){ 
      doSomeStuffOnlyWhenTheAsyncStuffIsFinish();  
     } 
    }) 
    .catch((e) => { 
     // handle errors here 
    }); 

Axel Rauschmayer ma dobry artykuł na obietnicach here.

Oto przykład - live copy on Babel's REPL:

function doSomethingAsync(value) { 
 
     return new Promise((resolve) => { 
 
     setTimeout(() => { 
 
      console.log("Resolving " + value); 
 
      resolve(value); 
 
     }, Math.floor(Math.random() * 1000)); 
 
     }); 
 
    } 
 
    
 
    function test() { 
 
     let i; 
 
     let promises = []; 
 
     
 
     for (i = 0; i < 5; ++i) { 
 
     promises.push(doSomethingAsync(i)); 
 
     } 
 
     
 
     Promise.all(promises) 
 
      .then((results) => { 
 
      console.log("All done", results); 
 
      }) 
 
      .catch((e) => { 
 
       // Handle errors here 
 
      }); 
 
    } 
 
    
 
    test();

(Nie przeszkadzało z .catch na to, ale ty chcesz .catch na swoim tych rzeczywistych, jak pokazano wcześniej).

Wyjście próbki (z powodu Math.random, co kończy się jako pierwsze może się różnić):

 
Resolving 3 
Resolving 2 
Resolving 1 
Resolving 4 
Resolving 0 
All done [0,1,2,3,4] 
+0

OK, dzięki, spróbuję tego teraz i przyjmuję informację zwrotną w kilka minut. – Ganbin

+7

Wow, wielkie dzięki, teraz rozumiem znacznie więcej obietnic. Czytam dużo o obietnicach, ale dopóki nie będziemy ich używać w prawdziwym kodzie, tak naprawdę nie rozumiemy wszystkich mechanizmów. Teraz rozumiem to lepiej i mogę zacząć pisać fajne rzeczy, dzięki tobie. – Ganbin

+0

Naprawdę pomocna, dziękuję! – Lucy

Powiązane problemy