Sorunun başlığına dayanarak, "Sırayla Çöz (ardışık olarak vaat ediyor?)?", OP'nin söz konusu anlaşmaların sıralı çağrılara göre sıralı işlemlerle ardışık işlemesi ile daha fazla ilgilendiğini anlayabiliriz .
Bu cevap sunulmaktadır:
- yanıtların sıralı olarak ele alınması için sıralı çağrıların gerekli olmadığını göstermek.
- bu sayfanın ziyaretçilerine uygun alternatif kalıplar göstermek - bir yıl sonra hala ilgileniyorsa OP dahil.
- OP'nin eşzamanlı olarak arama yapmak istemediğine dair iddialarına rağmen, bu durum gerçekten de olabilir, ancak aynı şekilde, başlıkta belirtildiği gibi yanıtların sıralı olarak ele alınma arzusuna dayanan bir varsayım olabilir.
Eşzamanlı çağrılar gerçekten istenmiyorsa, Benjamin Gruenbaum'un sıralı çağrıları (vb.) Kapsamlı bir şekilde kapsayan cevabına bakın.
Bununla birlikte, eşzamanlı çağrılara ve ardından yanıtların sıralı olarak işlenmesine izin veren kalıplarla ilgileniyorsanız (daha iyi performans için), lütfen okumaya devam edin.
Promise.all(arr.map(fn)).then(fn)
(Birçok kez yaptığım gibi) veya bir Promise lib'in süslü şekerini (özellikle Bluebird'in) kullanmanız gerektiğini düşünmek cazip gelebilir, ancak ( bu makaleye verilen krediyle ) bir arr.map(fn).reduce(fn)
desen, avantajları ile işi yapacak:
- herhangi bir sözlü lib ile çalışır - jQuery'nin önceden uyumlu sürümleri bile - sadece
.then()
kullanılır.
- tek satır moduyla istediğinizi atlamak veya hatada durmak için esneklik sağlar.
İşte için yazılmıştır Q
.
var readFiles = function(files) {
return files.map(readFile) //Make calls in parallel.
.reduce(function(sequence, filePromise) {
return sequence.then(function() {
return filePromise;
}).then(function(file) {
//Do stuff with file ... in the correct sequence!
}, function(error) {
console.log(error); //optional
return sequence;//skip-over-error. To stop-on-error, `return error` (jQuery), or `throw error` (Promises/A+).
});
}, Q()).then(function() {
// all done.
});
};
Not: yalnızca bu bir parça, Q()
Q'ya özgüdür. JQuery için, readFile () öğesinin bir jQuery sözü verdiğinden emin olmanız gerekir. A + libs ile yabancı vaatler özümsenecek.
Burada anahtar, azalma olduğunu sequence
dizileri söz, işlenmesini vereadFile
onların yaratılması vaat değil.
Ve bunu emdikten sonra, .map()
sahnenin gerçekten gerekli olmadığını fark ettiğinizde belki biraz kafa karıştırıcı olabilir ! Tüm iş, paralel çağrılar ve doğru sırayla seri kullanım, reduce()
tek başına elde edilebilir , ayrıca aşağıdakilere daha fazla esneklik avantajı sağlar:
- sadece bir satırı hareket ettirerek paralel zaman uyumsuz çağrılardan seri zaman uyumsuz çağrılara dönüştürün - geliştirme sırasında potansiyel olarak yararlıdır.
İşte Q
yine.
var readFiles = function(files) {
return files.reduce(function(sequence, f) {
var filePromise = readFile(f);//Make calls in parallel. To call sequentially, move this line down one.
return sequence.then(function() {
return filePromise;
}).then(function(file) {
//Do stuff with file ... in the correct sequence!
}, function(error) {
console.log(error); //optional
return sequence;//Skip over any errors. To stop-on-error, `return error` (jQuery), or `throw error` (Promises/A+).
});
}, Q()).then(function() {
// all done.
});
};
Bu temel kalıp. Arayana veri (örneğin dosyalar veya bunların bir kısmı dönüştürülmesi) vermek istiyorsanız, hafif bir varyanta ihtiyacınız olacaktır.