2015-07-15 9 views
24

Eşzamanlı olmayan şeyler yapan bir yöntemi çağıran bir döngüye sahibim. Bu döngü, yöntemi birçok kez çağırabilir. Bu döngüden sonra, yalnızca tüm zaman uyumsuz şeyler tamamlandığında yürütülmesi gereken başka bir döngüye sahibim. Yani bu benim isteğimi gösterir:Döngüde birçok vaatler nasıl döndürülür ve bunların tümünü başka şeyler yapmaları beklenir

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

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

Vaatler ile o kadar fazla aşina değilim ki, bunu başarmam için bana kimsenin yardımcı olabilir mi?

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

Belki böyle bir şey yapmak zorunda:

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

Ama sözdizimi emin değilim benim doSomeAsyncStuff() uslu nasıl

budur.

+0

Zaman uyumsuz çağrıları kontrol ediyor musunuz? Zaten vaatler veriyorlar mı, yoksa vaatlerini iade edebilir misiniz? –

+0

Sıra tam olarak nedir? Önceki tüm uyumsuzlar bittikten * sonra * diğer işlevleri çağırmanız mı gerekiyor? Yoksa her zaman uyumsuzluğun bittikten sonra bir işlevi çağırmanız mı gerekiyor? – Sosdoc

+0

Şimdilik ilk işlev söz vermiyor. Benim uygulamak zorunda olduğum. Mesajlarımı, işlevlerimin iş akışının bazı ayrıntılarını eklemek için düzenlemek istiyorum. Ve evet, ikinci döngüdeki maddeleri yürütmeye başlamadan önce, ilk döngüdeki tüm şeylerin bitirilmesine ihtiyacım var. – Ganbin

cevap

43

Bunun için Promise.all (spec, MDN) kullanabilirsiniz: Bireysel vaatler bir demet kabul eder ve geri olanları tüm bunu çözülür verince çözülmesi veya reddedilir tek söz verir zaman bunlardan herhangi reddedildi. Sonra doSomeAsyncStuff dönüşü bir söz, yaparsanız

Yani:

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 vaat here iyi bir makale vardır.

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

(bu konuda .catch ile rahatsız, ancak daha önce gösterildiği gibi, gerçek hayattaki olanlar .catch istiyorum yapmadım.)

: live copy on Babel's REPL - İşte

bir örnek

Örnek çıktısı (Math.random yüzünden, ilk bitirme işlemi değişebilir):

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

Tamam, şimdi bunu denedim ve birkaç dakika içinde geri bildirim ile geldim. – Ganbin

+7

Vay, çok teşekkürler, şimdi çok daha fazla vaatleri anlıyorum. Sözler hakkında çok şey okudum, ama onları gerçek kodda kullanana kadar, tüm mekanizmaları gerçekten anlamıyoruz. Şimdi daha iyi anladım ve sana güzel şeyler yazmaya başladım. – Ganbin

+0

Gerçekten yardımcı, teşekkürler! – Lucy

İlgili konular