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