рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рдПрд╕рд┐рдВрдХ рд╡рд╛рдЯрд░рдлреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХрдИ рдЬрдВрдЬреАрд░ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдереЗ рдЬреЛ рдмрд╣реБрдд рдЧрд╣рд░реЗ рдЬрд╛ рд░рд╣реЗ рдереЗ, рдФрд░ рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЖрджрд┐ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╢рд░реНрдд рд╣реИ рдЬреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐ рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╢реЗрд╖ рдЬрд▓рдкреНрд░рдкрд╛рдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рд╢реНрди рдХрд┐рдпрд╛ рдФрд░ рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдПрд╕рд┐рдВрдХ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ "рдЕрдВрддрд┐рдо" рдХреЙрд▓рдмреИрдХ рд╣реЛрдЧрд╛ рдФрд░ рдЬрд┐рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬрд▓рдкреНрд░рдкрд╛рдд рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рд╕рдлрд╛рдИ рд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдореИрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЕрдВрддрд┐рдо рдХреЙрд▓рдмреИрдХ рдкрд░ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдЧреИрд░ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖ рд╕рдХреЗред
рдирдорд╕реНрддреЗ,
рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрдм рддрдХ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рд▓реА рд╣реИ, рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдпрд╣ рдореЗрд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ:
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'
рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╢реЗрд╖ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рддрд░рд╣ рди рджрд┐рдЦреЗред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рддреЛ рдореЗрд░рд╛ рд╕рд╣рд╛рдпрдХ рдХрд╛рдордХрд╛рдЬ рдпрд╣рд╛рдВ рд╣реИ ...
рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рднреАрддрд░ рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдмрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЙрд▓ рдХрд░реЗрдВ:
done('break', other, arguments);
редрд╕рд╣рд╛рдпрдХ рдХреЗрд╡рд▓
'break'
рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╢реЗрд╖ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рддрд░рд╣ рди рджрд┐рдЦреЗред