Saya sering menghadapi situasi di mana tugas async.series membutuhkan hasil dari beberapa tugas sebelumnya. async.waterfall tidak cukup karena hanya memberikan hasil dari tugas terakhir sebelumnya. async,auto terlalu bertele-tele, dan memberikan deklarasi ketergantungan tambahan yang tidak dibutuhkan.
Fungsi baru (atau peningkatan async.series) akan berguna. Setiap tugas akan menerima objek hasil yang berisi hasil dari semua tugas sebelumnya
Kemungkinan nama: akumulasi, seriAccumulate
Contoh:
async.accumulate({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback, results){
// results: {one: 1}
setTimeout(function(){
callback(null, 2);
}, 100);
},
three: function(callback, results){
// results: {one: 1, two: 2}
setTimeout(function(){
callback(null, results.one + results.two);
}, 100);
}
},
function(err, results) {
// results is now equal to: {one: 1, two: 2, three: 3}
});
Sudahkah Anda memeriksa async.auto
? Itu melakukan sesuatu yang sangat mirip dengan apa yang Anda gambarkan.
Seperti yang saya sebutkan, dalam skenario seri sederhana async.auto terlalu bertele-tele, Pengguna harus menyatakan bahwa setiap langkah bergantung pada yang sebelumnya, menghasilkan array jelek dan nama langkah duplikat
async.auto({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: ["one", function(callback, results){
setTimeout(function(){
callback(null, 2);
}, 100);
}],
three: ["two", function(callback, results){
setTimeout(function(){
callback(null, results.one + results.two);
}, 100);
}
]
},
function(err, results) {
// results is now equal to: {one: 1, two: 2, three: 3}
});
Kami akan membuat beberapa peningkatan otomatis pada rilis utama berikutnya -- selalu membuat panggilan balik terakhir, dan juga menambahkan autoInject
(#608) yang menyimpulkan dependensi dari nama parameter.
Saya tidak suka proposal ini karena bergantung pada urutan kunci objek -- sesuatu yang tidak dijamin di seluruh lingkungan JS (dan hanya dijamin di Node untuk objek kecil). Dengan array dimungkinkan, tetapi terlalu mirip dengan async.waterfall
. Saya tidak yakin kita membutuhkan sesuatu di antara auto
dan waterfall
, terutama jika kita menambahkan autoInject
.
Cara untuk mencapai apa yang Anda inginkan:
function seriesAccumulate(tasks, done) {
async.reduce(tasks, [], function (results, task, next) {
task(results, function (err, result) {
results.push(result);
next(err, result);
});
}, done);
}
Saya akan merekomendasikan untuk tidak mencoba menggunakan objek untuk beralih secara seri.
Menutup ini. Saya tidak berpikir kita membutuhkan metode lain antara series
dan waterfall
dalam gaya.