Async: Versi async.series di mana setiap tugas menerima hasil dari semua tugas sebelumnya

Dibuat pada 16 Nov 2015  ·  5Komentar  ·  Sumber: caolan/async

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}
});
feature question

Semua 5 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat