Async: `async` рдлрд╝рдВрдХреНрд╢рди рд╕рдорд░реНрдерди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдорд╛рд░реНрдЪ 2017  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: caolan/async

рдХрдорд░реЗ рдореЗрдВ рд╣рд╛рдерд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирдпрд╛ async / await рд╕рдорд░реНрдерди рд╣реИ рдЬреЛ рдиреЛрдб рдФрд░ рдХреНрд░реЛрдо рдореЗрдВ рдЖ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЬрд▓реНрдж рд╣реА рд╣рд░ рджреВрд╕рд░реЗ рдкреНрд░рдореБрдЦ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ Async async / await рджреБрдирд┐рдпрд╛ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд╣рдо async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ asyncify рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрдХрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ async рдлрд╝рдВрдХреНрд╢рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рдкреБрд░рд╛рдирд╛ рдПрдбрд╛рдкреНрдЯрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕реЗ рдХреЙрд▓рдмреИрдХ-рд╢реИрд▓реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдмреЗрддреБрдХрд╛ рджрд┐рдЦрдиреЗ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:

async.mapLimit(arr, 10, async.asyncify(async (val) => {
  let foo = await doSomething(val);
  //...
 return bar;
}), done);

рд╣рд╛рд▓рд╛рдВрдХрд┐, async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐:

Object.getPrototypeOf(asyncFn)[Symbol.toStringTag] === "AsyncFunction"

рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ (рдореВрд▓) async рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ asyncify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдмрди рдЬрд╛рддрд╛ рд╣реИ:

async.mapLimit(arr, 10, async (val) => {
  let foo = await doSomething(val);
  //...
 return bar;
}, done);

... рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛрддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ await рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ promisify рдлрд╝рдВрдХреНрд╢рди, рдпрд╛ pify Async рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

let result = await pify(async.mapLimit)(arr, 10, async (val) => {
  let foo = await doSomething(val);
  //...
 return bar;
});

async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ рдореВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдмреИрдмреЗрд▓ рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИред рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рд╡рд╛рджреЗ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдкреВрд░реНрд╡рд╡реНрдпрд╛рдкреА рд░реВрдк рд╕реЗ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╣ рдПрдХ рдмрдбрд╝реА рдЪреЗрддрд╛рд╡рдиреА рд╣реЛрдЧреА рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЖрдзреБрдирд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд░ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдЕрднреА рднреА asyncify рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ред

рд╕рд╛рде рд╣реА, рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдХрдИ Async рд╡рд┐рдзрд┐рдпрд╛рдВ async / await рдХреЗ рд╕рд╛рде рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рдзрд┐рдпрд╛рдВ ( auto рдФрд░ queue рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗрдВ) рджреЗрд╢реА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЛрд╣рд░рд╛рдИ рдЬрд╛рддреА рд╣реИрдВред map рдФрд░ parallel рдХреЛ Promise.map рдФрд░ Promise.all рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реАрдорд┐рдд рд╕рдВрдЧреНрд░рд╣ рдХрд╛рд░реНрдп рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ, рд╕рд╛рде рд╣реА auto рдФрд░ рдХреБрдЫ рдЕрдиреНрдпред (рд╕рд╛рде рд╣реА, autoInject рдХреЗ рд╕рд╛рде async рдлрд╝рдВрдХреНрд╢рди рдПрдХ async рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдкрдирд╛ рд╣реИ!)

enhancement feedback-wanted

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

рдХреНрдпрд╛ Object.getPrototypeOf(asyncFn)[Symbol.toStringTag] === "AsyncFunction" рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдпрд╛ рдХреНрдпрд╛ рд╣рдо asyncFn[Symbol.toStringTag] === "AsyncFunction" (рдПрдлрдПрдл рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдХреИрдирдирд┐рдХрд▓ рдИрд╕реАрдПрдордП рд╕реНрдкреЗрдХ рддрд░реАрдХрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ asyncFn[Symbol.toStringTag] рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕реА рднреА рд╕рдордп рдкреНрд░рд╛рд░реВрдк cb (рдЧрд▓рддреА, arg) рдХрд╛ рдХреЙрд▓рдмреИрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ AsyncFunction рд╣реИ; рдпрджрд┐ рдпрд╣ рдПрдХ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рддреЛ рд╣рдореЗрдВ рд╡рд╛рджрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдиреНрдпрдерд╛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд╣реИред рдЬрд╣рд╛рдВ рдХрд╣реАрдВ рднреА рд╣рдо рдХреЙрд▓рдмреИрдХ-рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдлрд╝рдВрдХреНрд╢рди ( function(args..., callback) {} ) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ async рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдФрд░ рдлрд┐рд░ asyncify рдЗрд╕реЗред

await рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ Async рд╡рд┐рдзрд┐ await рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдХреЛрдИ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрд╕рд┐рдВрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рджреЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗ - рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред

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

рдореИрдВ рдЗрд╕ рдкрд░ рдХреБрдЫ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рддрдХрдиреАрдХреА рдкреНрд░рд╢реНрди рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореИрдВ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХреВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ ..

рдХреНрдпрд╛ Object.getPrototypeOf(asyncFn)[Symbol.toStringTag] === "AsyncFunction" рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдпрд╛ рдХреНрдпрд╛ рд╣рдо asyncFn[Symbol.toStringTag] === "AsyncFunction" (рдПрдлрдПрдл рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рддреЛ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕реА рднреА рд╕рдордп cb(err, arg) рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдХреЙрд▓рдмреИрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ AsyncFunction рд╣реИ рдпрд╛ рдирд╣реАрдВ; рдпрджрд┐ рдпрд╣ рдПрдХ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рддреЛ рд╣рдореЗрдВ promisify рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдиреНрдпрдерд╛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЕрдЧрд░ рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдХ AsyncFunction рд╣реИ рддреЛ await рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреНрдпрд╛ рдЪреБрдиреМрддрд┐рдпрд╛рдБ рд╣реИрдВ?

рдХреНрдпрд╛ Object.getPrototypeOf(asyncFn)[Symbol.toStringTag] === "AsyncFunction" рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдпрд╛ рдХреНрдпрд╛ рд╣рдо asyncFn[Symbol.toStringTag] === "AsyncFunction" (рдПрдлрдПрдл рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдХреИрдирдирд┐рдХрд▓ рдИрд╕реАрдПрдордП рд╕реНрдкреЗрдХ рддрд░реАрдХрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ asyncFn[Symbol.toStringTag] рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕реА рднреА рд╕рдордп рдкреНрд░рд╛рд░реВрдк cb (рдЧрд▓рддреА, arg) рдХрд╛ рдХреЙрд▓рдмреИрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ AsyncFunction рд╣реИ; рдпрджрд┐ рдпрд╣ рдПрдХ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рддреЛ рд╣рдореЗрдВ рд╡рд╛рджрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдиреНрдпрдерд╛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд╣реИред рдЬрд╣рд╛рдВ рдХрд╣реАрдВ рднреА рд╣рдо рдХреЙрд▓рдмреИрдХ-рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдлрд╝рдВрдХреНрд╢рди ( function(args..., callback) {} ) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ async рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдФрд░ рдлрд┐рд░ asyncify рдЗрд╕реЗред

await рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ Async рд╡рд┐рдзрд┐ await рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдХреЛрдИ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрд╕рд┐рдВрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рджреЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗ - рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред

#1390 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛!

рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдерд╛ рдФрд░ рдЗрд╕рдиреЗ рд╣рдорд╛рд░реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ред рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рдП рдмрд┐рдирд╛ рдРрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╕рдордп рдХреГрдкрдпрд╛ рджреЛ рдмрд╛рд░ рд╕реЛрдЪреЗрдВред

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

рдЧреЛрд▓реА рдорд╛рд░! рдХреНрдпрд╛ рдЯреВрдЯ рдЧрдпрд╛ред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЯрд┐рдХрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ
рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛?
рдзрдиреНрдпрд╡рд╛рдж!

рдмреБрдз, 5 рдЕрдкреНрд░реИрд▓, 2017 рдХреЛ рд╕реБрдмрд╣ 10:18 рдмрдЬреЗ рдореИрдиреБрдЕрд▓ рд╡рд╛рд▓реНрд╕ рдлрд░реНрдирд╛рдВрдбреАрдЬ <
рд╕реВрдЪрдирд╛рдПрдВ@github.com> рдиреЗ рд▓рд┐рдЦрд╛:

рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдерд╛ рдФрд░ рдЗрд╕рдиреЗ рд╣рдорд╛рд░реЗ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ред рдХреГрдкрдпрд╛ рджреЛ рдмрд╛рд░ рд╕реЛрдЪреЗрдВ
рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рдП рдмрд┐рдирд╛ рдРрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╕рдордпред

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

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/caolan/async/issues/1386#issuecomment-291875817 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/ADUIEPNkTSOVuuiwucBVrH983X6B568Wks5rs6K3gaJpZM4Mf64R
.

рдорд╛рди рдЧрдпрд╛, рдЗрд╕рдиреЗ рдореЗрд░рд╛ рдирд┐рд░реНрдорд╛рдг рднреА рддреЛрдбрд╝ рджрд┐рдпрд╛ ...

рдПрдХ рдЬрд▓рдкреНрд░рдкрд╛рдд рдЬреЛ рдПрдХ async рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬреЛ рдХреБрдЫ рджрд┐рди рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛, "cb is not function" рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд▓рдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ async рдХреЙрд▓рдмреИрдХ рдЕрдм рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд╣рдордиреЗ рдЖрдкрдХрд╛ рдХреЛрдб рддреЛрдбрд╝ рджрд┐рдпрд╛ред рд╣рдореЗрдВ async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рдерд╛ред рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк 2.2.0 рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВ, рдпрд╛ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ return рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВ, рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдПред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдмрд┐рд▓реНрд▓реА рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рдмреИрдЧ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд╛рдкрд╕ рд░реЛрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

@aearly рдХреГрдкрдпрд╛, рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рди рдХрд░реЗрдВ !! рдЙрддреНрддрд░ рджреЗрдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ :1st_place_medal:

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

рдореЗрд░рд╛ рдЭрд░рдирд╛ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ async рдПрдХ рдерд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рдерд╛ред

рддреЛ рдмрд╕ рд╕реЗ рдмрджрд▓рдХрд░:

... 
/* services module */
function doThis(param, cb) {
...
}

async function doThatAsync(param, cb) {
...
}

module.exports = {
  doThis: doThis,
  doThat: doThatAsync  
}; 

...
async.waterfall([
  services.doThis,
  services.doThat,  // fails with "cb is not a function"
], err => {
...
}

рдкреНрд░рддрд┐:

... 
/* services module */
function doThis(param, cb) {
...
}

async function doThatAsync(param, cb) {
...
}

module.exports = {
  doThis: doThis,
  doThat: (...args) => doThatAsync(..args)   // cheating the detection
}; 

...
async.waterfall([
  services.doThis,
  services.doThat, /* it works!!! */
], err => {
...
}

рдЖрдкрдХреЛ рдкреБрди: рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж

рдХреНрдпрд╛ рд╣рдо async.autoInject() рдХреЗ рд╕рд╛рде async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

async.autoInject({

    conn1: async function () {
      return conn1;
    },

    conn2: async function () {
      return conn2;
    },
});

рдХрд╛рдо рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ:

рддреНрд░реБрдЯрд┐: рдСрдЯреЛрдЗрдВрдЬреЗрдХреНрдЯ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
/Users/alexamil/WebstormProjects/nabisco/cdt-now/node_modules/async/dist/async.js:2081:23 рдкрд░
/рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдПрд▓реЗрдХреНрд╕рд╛рдорд┐рд▓/рд╡реЗрдмрд╕реНрдЯреЙрд░реНрдо рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕/рдирд╛рдмрд┐рд╕реНрдХреЛ/рд╕реАрдбреАрдЯреА-рдирд╛рдЙ/рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕/рдПрд╕рд┐рдВрдХ рдкрд░

@ORESoftware рд╣рд╛рдБ, async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ autoInject рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреНрд░реЛрдо рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдЪрд▓рд╛ред рдореБрдЭреЗ рдЕрдВрддрд┐рдо рдХреЙрд▓рдмреИрдХ рдореЗрдВ ReferenceError рдорд┐рд▓рд╛ рдХреНрдпреЛрдВрдХрд┐ conn1 рдФрд░ conn2 undefined рд╣реИрдВред рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж

async.autoInject({
    conn1: async function () {
      return 'foo'
    },
    conn2: async function () {
      return 'bar'
    },
})

рдпрд╣ рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓ рдХрд┐рдП рдЧрдП async рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

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

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

ashoksahoo picture ashoksahoo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

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

PsyTae picture PsyTae  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ