Async: рдХреЙрд▓рдмреИрдХ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдЬреБрд▓ре░ 2019  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: caolan/async

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ:

await async.parallel({foo: async()=>Promise.all([1,2])})
// { foo: [ 1, 2 ] }
await async.parallel({foo: ()=>Promise.all([1,2])})
// waits forever because non-async function expects a ballback

рдХреНрдпреЛрдВрдХрд┐ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ foo: () => doSomething() рд▓рд┐рдЦрдирд╛ рдЖрдХрд░реНрд╖рдХ рд╣реИред рд╡рд╣рд╛рдВ async рдХреАрд╡рд░реНрдб рдХреЛ рднреВрд▓рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ

рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ foo: async () => doSomething() рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреНрдпрд╛ рд╣рдо рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдХ AsyncFunction рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рд╣реБрдЖ рд╣реИ рдпрд╛ рдирд╣реАрдВ?

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

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

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

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред ( Function.length рдпрд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ Function.toString() рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ) рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ asyncify рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ - рд╡рд╛рджрд╛-рд╡рд╛рдкрд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓рдмреИрдХ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ред рдЪреВрдБрдХрд┐ рд╣рдо async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ asyncify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Async рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

@ рдЕрд░реНрд▓реА рд╣рдореНрдо рдареАрдХ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╢реАрд░реНрд╖-рд╕реНрддрд░ рдкрд░ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рдЖрд╕рд╛рди рд╣реЛ?

async function parallel(o, cb) {
  if (!cb) { // promise behavior
    return Object.fromEntries(
      await Promise.all(Object.entries(o).map(async ([k, v]) => [k, await v()]))
    )
  }
  // else do the callback behavior
}

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рдпрджрд┐ рдЖрдк рдХреЙрд▓рдмреИрдХ рдХреЛ async.parallel рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдХреЙрд▓рдмреИрдХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╡рд╛рджреЗ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рдорд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдареЛрд╕ рд╣реЛ: https://repl.it/@caub/async -async

// npm.im/async expects all inner functions to be async,
// even when using no outer callback (as 2nd arg of async.parallel)
console.log(
  await async.parallel({
    foo: async () => delay(1000).then(() => 1),
    bar: async (rs) => {
      return 2
    },
  })
);

// Doesn't work without those async,
// but I'd like this to resolve just like above instead of freezing
console.log(
  await async.parallel({
    foo: () => delay(1000).then(() => 1),
    bar: () => {
      return 2
    },
  })
);

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдЧрд▓реЗ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЗрд╡рд▓ рдХреЙрд▓рдмреИрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

await Promise.all([
  { then(resolve){ setTimeout(resolve, 50, 1) } }, // callback way
  2,
  delay(45).then(())=>3)
])
// [1, 2, 3]

рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ async рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рджреВрд░ рдХрд░рдирд╛

рд▓рд╛рдн рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИред рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рди рдорд╛рдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдмрд╛рдд рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рдпрд╣ рдорд╛рди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд▓реЛрдЧ рд╡рд╛рджрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╕рдордп async рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рднреВрд▓реЗрдВрдЧреЗ

рдпрд╣ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЛ рдмрд╣реБрдд рдмрдбрд╝реЗ рддрд░реАрдХреЗ рд╕реЗ рддреЛрдбрд╝ рджреЗрдЧрд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк Async.map(fileNames, fs.readFile) рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдФрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдХреНрдпрд╛ рдЖрдк рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдБ рдЯреВрдЯреЗрдЧрд╛?

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмреНрд░реЗрдХ рдХреНрдпрд╛ рд╣реИ:

await async.map(['server.js', 'package.json'], fs.readFile) // works
await async.map(['server.js', 'package.json'], fs.promises.readFile) // works
await async.map(['server.js', 'package.json'], s => fs.promises.readFile(s)) // doesn't work
await async.map(['server.js', 'package.json'], async s => fs.promises.readFile(s)) // works

рддреАрд╕рд░реЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ

рдореБрдЭреЗ рд╡реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд▓рдЧрд╛рддрд╛рд░ рдЖрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛:

  // ...
  doc = await async.map(items, item => item.toDoc(currentUser, options));

рдХрд╣реАрдВ, рдФрд░ рдлрд┐рд░, рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ async item => item.toDoc.. рдпрд╛рдж рдЖ рд░рд╣рд╛ рдерд╛

рдЕрдЧрд░ рдореИрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдХреЗрд▓рд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдФрд░ рд▓реЛрдЧ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдмрджрд▓рд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ

async.map рд╕рд╛рде рдпрд╣ рдЙрджрд╛рд╣рд░рдг рднреА рдмрд╣реБрдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдореЗрд░реА рдмрд╛рдд рдХреЛ рдХреИрд╕реЗ . рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

  doc = await Promise.all(items.map(item => item.toDoc(currentUser, options)));

async item => item.toDoc.. рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

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

@caub рдмреЗрд╢рд░реНрдо рдкреНрд▓рдЧ рдпрд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ asyncp рдореЗрдВ рдЖрдк рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

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

@caub рдпрд╣реА рдХрд╛рд░рдг рд╣реИ
https://github.com/caolan/async/blob/8aecf108b3922bc5211036706a0f6f75e02bd42b/lib/internal/wrapAsync.js#L3 :L5

function isAsync(fn) {
    return fn[Symbol.toStringTag] === 'AsyncFunction';
}

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function рд╕реЗ

async рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЛ рд╢реВрдиреНрдп рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдХреЛрдб, рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдпрджрд┐ рдХреЛрдИ рд╣реИ) рд╕рд╣рд┐рдд рдФрд░ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

... рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмреЗрдХрд╛рд░ рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдб рдХреЛ рдмреЗрдмреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдпрд╣ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ async рдХреАрд╡рд░реНрдб рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХ рдХреЛрдб рдФрд░ рдХрджрдо рдЬреЛрдбрд╝ рджреЗрдЧрд╛

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд:

async function foo() {
   return 1
}

...рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

function foo() {
   return Promise.resolve(1)
}

рд▓реЗрдХрд┐рди рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде,

async.mapLimit([1], 1, async v => v)

рддрдерд╛

async.mapLimit([1], 1, v => Promise.resolve(v)))

рд╕рдордХрдХреНрд╖ рдирд╣реАрдВ рд╣реИрдВ!

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

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

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

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

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

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

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