2017-03-19 26 views
6

Bu yüzden bir sunucudan veri toplayan ancak yalnızca bir seferde 50 yanıt toplayan bir sözüm var. Toplamak için 250 yanıtım var.Sözler için bir döngü oluşturma

ı could birlikte bu yönetilebilir bir çözüm gibi görünüyor ama orada bir döngü içinde sözleri concating bir yoludur bu yüzden sadece 250 sonuç ihtiyaç Bu durumda

new Promise((resolve, reject) => { 
    resolve(getResults.get()) 
    }) 
    .then((results) => { 
    totalResults.concat(results) 
    return getResults.get() 
    }) 
    .then((results) => { 
    totalResults.concat(results) 
    return getResults.get() 
    }).then((results) => { 
    totalResults.concat(results) 
    return getResults.get() 
    }) 

altında gibi sadece concate sözler. bu yüzden 5 kez bir döngü çalıştırıyorum ve her seferinde bir sonraki sözü çalıştırıyorum.

Maalesef, söz veriyorum ve bu geri aramalar olsaydı, ne yapardım.

+1

Bir söz vermediniz mi? –

+0

Bunun için [async] (http://caolan.github.io/async/) kütüphanesine göz atmanızı tavsiye ederim. Hayatınızı kolaylaştıracak. Async.eachLimit işlevine bakın. – forrestmid

+0

@forrestmid Hayır, bu sözlerle iyi çalışmıyor. – Bergi

cevap

7

Eğer döngü istiyorum ve bir, o zaman bu döngü deneyin başarısız bir kez başka get aramaların yürütme değil, vaat tefrika: Eğer promise construction anti-pattern kaçınmalıdır

function getAllResults() { // returns a promise for 250 results 
    let totalResults = []; 
    let prom = getResults.get(); 
    for (let i = 0; i < 4; i++) { // chain four more times 
     prom = prom.then(results => { 
      totalResults = totalResults.concat(results); 
      return getResults.get(); 
     }); 
    } 
    return prom.then(results => totalResults.concat(results)); 
} 

Not. new Promise'un burada kullanılması gerekli değildir. Hata koşullarıyla başa çıkmak için yukarıdaki işlev tarafından döndürülen sözle .catch() numaralı çağrıyı eklemeyi de düşünebilirsiniz.

Son olarak, concat'un aradığınız diziyi değiştirmediğinin farkında olun. Birleştirilmiş diziyi döndürür, bu nedenle bu dönüş değerini atamanız gerekir. Kodunuzda dönüş değerini atamazsınız, bu nedenle çağrının hiçbir etkisi olmaz.

+2

“Prom = Promise.resolve ([])' ile başlamak isteyebilirsiniz, böylece 'get' çağrılarını çoğaltmak zorunda kalmazsınız. ve birleştirme ve 5'e kadar sayın. – Bergi

+0

teşekkürler bu güzel çalışıyor. Mükemmel öneri –

8

Muhtemelen sadece Promise.all yöntemine ihtiyacınız vardır. Her istek için bir söz vermeli ve bir diziye koymalısınız, sonra her şeyi all yöntemiyle tamamlayacaksınız ve işiniz bitti. Promise.all at MDN

DÜZENLEME Sen vaatlerle bu şekilde döndürdüğü verilere erişebilir :

let promiseChain = []; 
for(let i = 0; i <5; i++){ 
    promiseChain.push(getResults.get()); 
} 

Promise.all(promiseChain) 
    .then(callback) 

Burada bu yöntem hakkında daha fazla bilgi edinebilirsiniz:

Örnek (getResults.get döner bir söz olduğunu varsayarak) :

function callback(data){ 
    doSomething(data[0]) //data from the first promise in the chain 
    ... 
    doEventuallySomethingElse(data[4]) //data from the last promise 
} 
+0

OP'nin bu yaklaşımı kullanarak get() çağrılarının sonuçlarını almasını nasıl öneriyorsunuz? – rasmeister

+0

Düzenleme bak;) – Phugo

+0

teşekkürler ama bu aynı 50 sonuç döndürüyor 5 kez –

İlgili konular