Async: memutus rantai air terjun tanpa membuat kesalahan

Dibuat pada 15 Feb 2011  ·  8Komentar  ·  Sumber: caolan/async

Saya diberitahu bahwa saya perlu memperbaiki kode saya yang menggunakan air terjun async. Saya menggunakannya terutama karena saya memiliki beberapa fungsi yang dirantai yang terlalu dalam, dan saya ingin menggunakan kembali suatu fungsi, dll. Ada suatu kondisi pada satu titik di bawah rantai yang tidak sepenuhnya merupakan kondisi kesalahan, tetapi saya tidak melakukannya ingin mewariskan sisa rantai air terjun, karena itu tidak berguna - katakan misalnya saya melakukan kueri dan tidak ada hasil, dan itu bukan kesalahan, saya tidak ingin menyebarkan semuanya tanpa hasil. Jika saya melakukan ini tanpa async, saya kira saya akan memiliki panggilan balik "final" dan yang dapat dipanggil untuk keluar dari rantai tanpa secara eksplisit membuat kesalahan. Fungsionalitas ini sepertinya tidak ada di air terjun. Apakah ada cara untuk melakukan ini dengan bersih? Satu-satunya cara yang bisa saya lihat untuk melakukannya adalah dengan melemparkan kesalahan khusus dan kemudian menanganinya pada panggilan balik terakhir untuk mengembalikan kesalahan yang tidak.

Komentar yang paling membantu

Secara pribadi saya menemukan diri saya membutuhkan fungsionalitas seperti ini dan berpikir itu harus ditambahkan ke perpustakaan inti.

Inilah solusi pembantu saya jika ada yang tertarik ...

exports.breakWaterfall = function(tasks, callback){
    async.waterfall(tasks, function(){
        if(arguments[0] === 'break'){
            arguments[0] = null;
        }
        callback.apply(null, arguments);
    });
}

Jika Anda perlu istirahat ke fungsi terakhir dalam suatu tugas, panggil saja panggilan balik seperti ini: done('break', other, arguments); .

Helper hanya mendeteksi 'break' dan mengubah argumen sehingga tidak terlihat seperti kesalahan pada kode Anda lainnya.

Semua 8 komentar

Hai,

Anda mungkin memecahkan masalah Anda sekarang, btw ini pendekatan saya:

var flow = [
    async.apply(...),
    // ...
];

async.waterfall(flow, function (err) {
    if (err === 'ok') return;
    // handle error
});

Saat suatu fungsi memanggil panggilan balik dengan err = 'ok' , panggilan balik terakhir dari air terjun memotongnya.

Saya memiliki masalah serupa & saya menambahkan pembungkus panggilan balik (yang dapat saya hindari) hanya untuk memeriksa apakah ini kesalahan atau tidak untuk setiap air terjun yang saya gunakan. Tidak begitu bersih ketika ada lebih dari satu air terjun.
Bisakah fungsi panggilan balik itu sendiri memiliki properti lain yang disebut 'final', yang dapat dipanggil orang untuk pergi ke akhir.
Sesuatu seperti

function search (cond, callback) {
  async.waterfall([function (cb) {
      db.get(cond, cb);
    },
    function (res, cb) {
      if (!res || !res.length)
        return cb.final();
      //do something useful
    }
  ], callback);
}

saya tidak perlu membungkus panggilan balik & itu bisa dirantai ke sisa program.

@caolan apakah ada yang tidak Anda sukai dari @jnordberg pull request? Dan jika demikian, apakah ada yang bisa saya lakukan agar permintaan tarik ini diterima?

@tax : sebenarnya saya menemukan bahwa kita dapat melompat ke fungsi terakhir dengan melewatkan 'error' = true seperti ini:

async.waterfall([fungsi (panggilan balik) {
panggilan balik (nol); // <--- pergi ke fn berikutnya
},
fungsi (panggilan balik) {
panggilan balik (benar); // <--- lompat ke fn terakhir
},
fungsi (panggilan balik) {
panggilan balik (nol); // <--- fn ini tidak akan dipanggil
}
], panggilan balik);

@tot2ivn terima kasih atas tipnya!

Jika Anda mengatur kesalahan, hasilnya akan kosong.

var async = require('async');

async.waterfall( [
  function( callback ){
    console.log('one');
    callback( null );
  },

  function( callback ){
    console.log('two');
    callback( true, 'more info' );
  },

  function( callback ){
    console.log('three');
    callback( null );
  }
], function(err, result){
  console.log( err, result );
} );

// RESULT
// one
// two
// true undefined

Mengingat komentar @caolan saat menutup pull request #85, masalah ini mungkin harus ditutup

Secara pribadi saya menemukan diri saya membutuhkan fungsionalitas seperti ini dan berpikir itu harus ditambahkan ke perpustakaan inti.

Inilah solusi pembantu saya jika ada yang tertarik ...

exports.breakWaterfall = function(tasks, callback){
    async.waterfall(tasks, function(){
        if(arguments[0] === 'break'){
            arguments[0] = null;
        }
        callback.apply(null, arguments);
    });
}

Jika Anda perlu istirahat ke fungsi terakhir dalam suatu tugas, panggil saja panggilan balik seperti ini: done('break', other, arguments); .

Helper hanya mendeteksi 'break' dan mengubah argumen sehingga tidak terlihat seperti kesalahan pada kode Anda lainnya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat