2015-05-25 13 views
5

dizisinde yürüt. Dizideki her öğe için bazı async görevlerine dair bir sözüm var, ancak bunları seri olarak yürütmek istiyorum. Promise.all sadece bir sözün listesini birleştiren yeni bir söz vermesi için yararlıdır, ancak bunları bir sırada çağırmaz. Ben mavi kuş Q gibi üçüncü parti kütüphaneleri olmadan bu kullanarak standart vaadi api elde edebilirsiniz nasılYerel js sözünü

.... başka söz döndüren bir geri arama ile .then() kullanılarak

+0

Neden Promise.all değil görevi tatmin ediyor? – elclanrs

+1

@tarini [bu makaleye] bir göz atın (http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html). Özellikle "Gelişmiş hata # 3: sözler vs söz fabrikaları" bölümünde. –

cevap

15

Sen zinciri vaat. Yani, diyelim ki, a, b ve c fonksiyonlarının hepsinin bir söz vermesi. Böyle (sırayla yürütmek) zincirleyin edebilirsiniz: Bir dizi işliyorsanız

a().then(b).then(c).then(function(result) { 
    // all are done here 
}); 

ve size dizide her öğe için aramak istediğiniz bir söz-dönen işlevi myFunc var, bir de kullanabilirsiniz Bu gerçekten sadece ilk örnekte olduğu gibi .then() işleyicileri bir demet zincirleme olduğu bakılırsa

var items = [...]; 

items.reduce(function(p, item) { 
    return p.then(function() { 
     return myFunc(item); 
    }); 
}, Promise.resolve()); 

ama: .reduce() dizilerin ve vaatler için standart tasarım deseni böyle bir anda dizi bir öğe yürümeye dizi sizin için yürümek için .reduce() yapısını kullanarak.

+0

'.reduce()' ile bir dizi yürüterek sıralı sözler eklendi. – jfriend00

+0

tasarım pratiğini düşürmek süper cool! Teşekkürler! –