рд╡рд╛рджреЗ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ

Node.js рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдгрдиреАрддрд┐ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдпрд╣ рдЫреЛрдЯреЗ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдб рджреНрд░рд╡реНрдпрдорд╛рди рдмрдврд╝рддрд╛ рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд, рддрдерд╛рдХрдерд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред

рдпрд╣ рд▓реЗрдЦ рдЫреЛрдЯреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп "рдлреНрд▓реЙрдкреА" рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рдЬреЛ рдЯрд┐рдо рдЯрд┐рдо рдХреИрд╕рд╡реЗрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд╣реИ, рдФрд░ рдЬрд┐рд╕рдХрд╛ рдореВрд▓ рдХреЙрдордирдЬрд╕ рдкреНрд░реЙрдорд┐рд╕ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд╕рд╛рде рд╣реА рддрд░реНрдХ рдпрд╣ рднреА рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рджреЗ рдЗрддрдиреЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреНрдпреЛрдВ рд╣реИрдВред




рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ


function leaveMessage(username, text, callback) { Flowy( function() { // concurrent execution of two queries model.users.findOne(username, this.slot()); model.settings.findOne(username, this.slot()); }, function(err, user, settings) { // error propagating if (!user) throw new Error('user not found'); if (!settings.canReceiveMessages) throw new Error('violating privacy settings'); model.messages.create(user, text, this.slot()); }, function(err, message) { model.notifications.create(message, this.slot()); }, callback //any error will be automatically propagated to this point ); } 



рдРрд╕рд╛ рдХреНрдпреЛрдВ рджрд┐рдЦрддрд╛ рд╣реИ?


рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреЛ Node.js рдХреЗ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ I / O рд╕рдмрд╕рд┐рд╕реНрдЯрдо API рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдирд┐рдореНрди рд░реВрдк рдХрд╛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 fs.readFile('/etc/passwd', 'utf8', function (err, data) { if (err) throw err; console.log(data); }); 

рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдПрдХ рдХреЗ рд╕рдорд╛рди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдЦрдирд╛ рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдЗрдЪреНрдЫрд╛ рд╣реЛрдЧреА - рдХрдо рд╕реЗ рдХрдо рдЖрд╢реНрдЪрд░реНрдп рдХрд╛ рдирд┐рдпрдо рд╕рдорд░реНрдерд┐рдд рдХреЛрдб рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдбрд┐рдмрдЧ рдХрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣рд╛рдБ рд╕реЗ рдкрд╣рд▓реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрддреА рд╣реИ:

рд╣рдо "рджреЗрд╢реА" рдиреЛрдбрдЬ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ Flowy рд╕реНрдЯреЗрдк рдореЗрдВ рдПрдХ рдиреЛрдбрдЬрд╕ рдХреЙрд▓рдмреИрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдиреЛрдбреНрдЬ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЪрд░рдгреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

рдЙрд╕реА рд╕рдордп, рдкреНрд░реЛрдорд┐рд╕ рдХреЗ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ (рдХреНрд░рд┐рд╕ рдХреЙрд╡реЗрд▓ рдХреА "рдХреНрдпреВ" рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рдкреНрд░реЛрдорд┐рд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдХрд░ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдореЗрдВ рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХреЙрд▓рдмреИрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред

 // chaining promises: Q.fcall(step1).then(step2).then(step3).done() return getUsername() .then(function (username) { return getUser(username) .then(function (user) { // if we get here without an error, the value returned here // or the exception thrown here resolves the promise returned by the first line }) }) 

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

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреЗрд╡рд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдореМрдЬреВрджрд╛ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдмреАрдЪ "рдЧреЛрдВрдж" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рднрд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред "рдлреНрд▓реЙрдкреА" рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЪрд░рдгреЛрдВ рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИрдВ - рдЧреЛрдВрдж рд╣реА - рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП "рд╕реНрд╡рдЪреНрдЫ" рд░рд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреБрдЯреА рдХреБрдЯреА рдореЗрдВ рд╣реА рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЬреЛ рдЖрдкрдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рд╕реЗ рдЪреИрдирд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХреЙрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрдпреВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдЬреАрдм рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

 Q.allResolved(promises) .then(function (promises) { promises.forEach(function (promise) { if (promise.isFulfilled()) { var value = promise.valueOf(); } else { var exception = promise.valueOf().exception; } }) }) 

рд╕рдм рдХреБрдЫ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╣рдо рдЕрдЪрд╛рдирдХ рдирд┐рдпрдо "рдПрдХ рддрд░реНрдХ - рдПрдХ рд▓реМрдЯрд╛ рдореВрд▓реНрдп" рдХреЛ рддреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрднреНрдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 return getUsername() .then(function (username) { return [username, getUser(username)]; }) .spread(function (username, user) { }) 

рдЗрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЦреБрдж рдмрддрд╛рддреА рд╣реИ:

рд╣рдо рдХрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлреНрд▓реЙрдкреА рдЕрдкрдиреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдХрд╛рд░рдг рдбреЗрд╡рд▓рдкрд░ рдХреА рдУрд░ рд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, "рдлреНрд▓реЙрдкреА" рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рд▓реНрдХрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬреЛ рдХрд┐ Node.js рдХреЗ рддрд╣рдд рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЦреБрдж рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣ рд▓реЗрдЦ рдХреЗрд╡рд▓ рдлрд╝реНрд▓реЙрдореА рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкрд░рд┐рдЪрд┐рдд рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЬреАрдердм рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдЪреБрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдорд┐рд▓реЗрдВрдЧреЗред

рдЙрдкрдпреЛрдЧреА рд╕реНрд░реЛрдд:

Source: https://habr.com/ru/post/In166419/


All Articles