рдореБрдЭреЗ рдЕрдкрдиреЗ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдИрд╡реЗрдВрдЯ рдХреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдПрдХ async рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рдХреЛ рддреБрд░рдВрдд рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓рдмреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
async.auto({
// This needs to run first, but it will finish second
event: [(next) => {
emitter.once('awesome', next);
}],
// This needs to finish near the end
checkResults: ['event', (results, next) => {
assert(results.event.status == 200);
assert(results.event.msg == 'cool');
// Do other async stuff...
somethingAsync(next);
}],
// This has to start second, but before the first one finishes
emit: ['event', (results, next) => {
event.emit('awesome', {msg: 'cool'}, next);
}],
checkEmit: ['emit', (results, next) => {
// some sort of check that can be async
},
], done);
event
рдХреЛ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди emit
рд╣реЛрдиреЗ рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред emit
рдХреЛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП event
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ (рдЙрд░реНрдл рдмрд╕ рд╣реИрдВрдбрд▓рд░ рд╕реЗрдЯ рдХрд░реЗрдВ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдПрд╕рд┐рдВрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ? (рд╕рд╛рдл рддрд░реАрдХреЗ рд╕реЗ)
рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕реЗ async рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
async.auto({
listen: [(next, done) => {
client.on(done);
return next();
},
...
}, callback);
рдореИрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░, рдЙрддреНрд╕рд░реНрдЬрдХ рдФрд░ рд╢реНрд░реЛрддрд╛рдУрдВ (рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдкрд░рд┐рдгрд╛рдо рд▓реЗрдирд╛, рдФрд░ рдЪреЗрдХ рдХреЛ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдирд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреНрд░рдо рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╣реЛрдЧрд╛)ред рд╕рд╛рде рд╣реА, рдХреЛрдб рдХрдо рд╕рдкрд╛рдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕реЗрдЯрдЕрдк рдореЗрдВред
рд╣рд╛рдп @ рд╕реЗрд╡рди , рд╕рд╡рд╛рд▓ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддреНрд╡рд░рд┐рдд, рд╕рд╛рдл рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛:
async.auto({
// This needs to finish near the end
checkResults: [(next) => {
return next(null, (results, next) => {
assert(results.event.status == 200);
assert(results.event.msg == 'cool');
// Do other async stuff...
// somethingAsync(next);
});
}],
// This needs to run first, but it will finish second
event: ['checkResults', (handler, next) => {
emitter.once('awesome', handler.checkResults);
return next();
}],
// This has to start second, but before the first one finishes
emit: ['event', (results, next) => {
// Should this be emitter.emit instead of event.emit?
event.emit('awesome', {msg: 'cool'}, next);
}],
checkEmit: ['emit', (results, next) => {
// the results of `checkResults` will be in `results.emit`
// as the handler on 'awesome' was passed the `next`
// callback from `emit`
// some sort of check that can be async
yourChecks(next);
}]
}, function done(err) {
// everything finished running, unless `err` !== `null`
});
рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдЖрдк рдХреЗрд╡рд▓ event
рдФрд░ checkResults
рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕реНрд╡реИрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХреНрд▓реАрдирд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ event
рд╣реИрдВрдбрд▓рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ checkResults
ред checkResults
рдЕрдм рдХреЗрд╡рд▓ рд╣реИрдВрдбрд▓рд░ рдХреЛ event
ред
рдирд┐рд╖реНрдкрд╛рджрди рдЖрджреЗрд╢ рд╣реЛрдЧрд╛:
checkResults --> event --> emit --> handler (passed to event from checkResults) --> checkEmit --> done
ред
рдЕрдЧрд░ рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред
рд╣рд╛рдБ, рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рд╡рд╣ рдкрд╛рдЧрд▓рдкрдирдкреВрд░реНрдг рдСрдЯреЛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ: рдмрд┐рд▓реНрдбрд┐рдВрдЧ_ рдирд┐рд░реНрдорд╛рдг:
рдорд╛рдирд╛ред рдЖрдорддреМрд░ рдкрд░ async рдХреЙрд▓рдмреИрдХ рдФрд░ рдЗрд╡реЗрдВрдЯ рдПрдорд┐рдЯрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ ...
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рд╡рд╣ рдкрд╛рдЧрд▓рдкрдирдкреВрд░реНрдг рдСрдЯреЛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ: рдмрд┐рд▓реНрдбрд┐рдВрдЧ_ рдирд┐рд░реНрдорд╛рдг: