Async: рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдЬрд▓рдкреНрд░рдкрд╛рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рддреЛрдбрд╝рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдлрд╝рд░ре░ 2011  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: caolan/async

рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рдПрд╕рд┐рдВрдХ рд╡рд╛рдЯрд░рдлреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХрдИ рдЬрдВрдЬреАрд░ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдереЗ рдЬреЛ рдмрд╣реБрдд рдЧрд╣рд░реЗ рдЬрд╛ рд░рд╣реЗ рдереЗ, рдФрд░ рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЖрджрд┐ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╢рд░реНрдд рд╣реИ рдЬреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐ рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╢реЗрд╖ рдЬрд▓рдкреНрд░рдкрд╛рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рд╢реНрди рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдПрд╕рд┐рдВрдХ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ "рдЕрдВрддрд┐рдо" рдХреЙрд▓рдмреИрдХ рд╣реЛрдЧрд╛ рдФрд░ рдЬрд┐рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬрд▓рдкреНрд░рдкрд╛рдд рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рд╕рдлрд╛рдИ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдореИрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЕрдВрддрд┐рдо рдХреЙрд▓рдмреИрдХ рдкрд░ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдЧреИрд░ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖ рд╕рдХреЗред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рдореЗрд░рд╛ рд╕рд╣рд╛рдпрдХ рдХрд╛рдордХрд╛рдЬ рдпрд╣рд╛рдВ рд╣реИ ...

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

рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рднреАрддрд░ рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдмрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЙрд▓ рдХрд░реЗрдВ: done('break', other, arguments); ред

рд╕рд╣рд╛рдпрдХ рдХреЗрд╡рд▓ 'break' рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╢реЗрд╖ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рддрд░рд╣ рди рджрд┐рдЦреЗред

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирдорд╕реНрддреЗ,

рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрдм рддрдХ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рд▓реА рд╣реИ, рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдпрд╣ рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ:

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

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

рдЬрдм рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди err = 'ok' рд╕рд╛рде рдХреЙрд▓рдмреИрдХ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЙрдЯрд░рдлреЙрд▓ рдХрд╛ рдЕрдВрддрд┐рдо рдХреЙрд▓рдмреИрдХ рдЗрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдПрдХ рдХреЙрд▓рдмреИрдХ рд░реИрдкрд░ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВ (рдЬрд┐рд╕реЗ рдореИрдВ рдЯрд╛рд▓ рд╕рдХрддрд╛ рдерд╛) рдмрд╕ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдЭрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЬрдм рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЭрд░рдиреЗ рд╣реЛрдВ рддреЛ рдпрд╣ рдЙрддрдирд╛ рд╕рд╛рдл рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрд╡рдпрдВ 'рдлрд╛рдЗрдирд▓' рдирд╛рдордХ рдПрдХ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд▓реЛрдЧ рдЕрдВрдд рддрдХ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣

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

рдореБрдЭреЗ рдХреЙрд▓рдмреИрдХ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╢реЗрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЬрдВрдЬреАрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@caolan рдХреНрдпрд╛ рдХреБрдЫ рднреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ @jnordberg рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ? рдФрд░ рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

@ рдХрд░ : рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╣рдо 'рддреНрд░реБрдЯрд┐' = рд╕рддреНрдп рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд╛рд╕ рдХрд░рдХреЗ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

async.waterfall ([рдлрд╝рдВрдХреНрд╢рди (рдХреЙрд▓рдмреИрдХ) {
рдХреЙрд▓рдмреИрдХ (рд╢реВрдиреНрдп); // <--- рдЕрдЧрд▓реЗ fn . рдкрд░ рдЬрд╛рдПрдВ
},
рдлрд╝рдВрдХреНрд╢рди (рдХреЙрд▓рдмреИрдХ) {
рдХреЙрд▓рдмреИрдХ (рд╕рдЪ); // <--- рдЕрдВрддрд┐рдо fn рдкрд░ рдЬрд╛рдПрдВ
},
рдлрд╝рдВрдХреНрд╢рди (рдХреЙрд▓рдмреИрдХ) {
рдХреЙрд▓рдмреИрдХ (рд╢реВрдиреНрдп); // <--- рдЗрд╕ fn рдХреЛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛
}
], рд╡рд╛рдкрд╕ рдХреЙрд▓ рдХрд░реЗрдВ);

@tot2ivn рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдпрджрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд░рд┐рдгрд╛рдо рдЦрд╛рд▓реА рд╣реЛрдЧрд╛ред

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

рдкреБрд▓ рдЕрдиреБрд░реЛрдз #85 рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдкрд░ @caolan рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рдореЗрд░рд╛ рд╕рд╣рд╛рдпрдХ рдХрд╛рдордХрд╛рдЬ рдпрд╣рд╛рдВ рд╣реИ ...

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

рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рднреАрддрд░ рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдмрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЙрд▓ рдХрд░реЗрдВ: done('break', other, arguments); ред

рд╕рд╣рд╛рдпрдХ рдХреЗрд╡рд▓ 'break' рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╢реЗрд╖ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рддрд░рд╣ рди рджрд┐рдЦреЗред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

alexpusch picture alexpusch  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

JustinBeaudry picture JustinBeaudry  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gone-phishing picture gone-phishing  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cobya picture cobya  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ORESoftware picture ORESoftware  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ