Async: `async` ๊ธฐ๋Šฅ ์ง€์›

์— ๋งŒ๋“  2017๋…„ 03์›” 16์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: caolan/async

๋ฐฉ์— ์žˆ๋Š” ์ฝ”๋ผ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋Š” Node ๋ฐ Chrome์— ์ œ๊ณต๋˜๊ณ  ๊ณง ๋‹ค๋ฅธ ๋ชจ๋“  ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์— ์ ์šฉ๋  ์ƒˆ๋กœ์šด async / await ์ง€์›์ž…๋‹ˆ๋‹ค. ์ €๋Š” Async๊ฐ€ async / await ์„ธ๊ณ„์—์„œ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด ์™”์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ asyncify ๋กœ ๋ž˜ํ•‘ํ•˜์—ฌ async ํ•จ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. async ํ•จ์ˆ˜๋Š” ๋ณธ์งˆ์ ์œผ๋กœ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ผ ๋ฟ์ด๋ฏ€๋กœ ์ด์ „ ์–ด๋Œ‘ํ„ฐ๋Š” ์ด๋ฅผ ์ฝœ๋ฐฑ ์Šคํƒ€์ผ ํ•จ์ˆ˜๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹ค์†Œ ํ„ฐ๋ฌด๋‹ˆ์—†๋Š” ๋ชจ์–‘์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

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 ์ „์ฒด์ ์œผ๋กœ ๋น„๋™๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

async ํ•จ์ˆ˜๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์œ„์˜ ๋ฐฉ๋ฒ•์€ ๊ธฐ๋ณธ ํ•จ์ˆ˜์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Babel ํŠธ๋žœ์ŠคํŒŒ์ผ ๊ธฐ๋Šฅ์„ ๊ฐ์ง€ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์†Œ๊ธ‰์ ์œผ๋กœ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” ํ™•์‹คํžˆ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ด๊ฒƒ์ด ๋งค์šฐ ํ˜„๋Œ€์ ์ธ ํ™˜๊ฒฝ์—์„œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ์—†์ด๋งŒ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ์—„์ฒญ๋‚œ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—ฌ์ „ํžˆ asyncify ๋กœ ์ˆ˜๋™์œผ๋กœ ๋ž˜ํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋งŽ์€ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ async / await ๋กœ ์ดํ•ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ œ์–ด ํ๋ฆ„ ๋ฉ”์„œ๋“œ( auto ๋ฐ queue ์ œ์™ธ)๋Š” ๊ธฐ๋ณธ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์„ฑ์œผ๋กœ ๋” ์‰ฝ๊ฒŒ ๋ณต์ œ๋ฉ๋‹ˆ๋‹ค. map ๋ฐ parallel ๋Š” Promise.map ๋ฐ Promise.all ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œํ•œ์ ์ธ ์ˆ˜์ง‘ ๊ธฐ๋Šฅ๊ณผ auto ๋ฐ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋˜ํ•œ async ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” autoInject ๋Š” ๋น„๋™๊ธฐ ์ œ์–ด ํ๋ฆ„์˜ ๊ฟˆ์ž…๋‹ˆ๋‹ค!)

enhancement feedback-wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Object.getPrototypeOf(asyncFn)[Symbol.toStringTag] === "AsyncFunction" ๋ฅผ ํ•  ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด asyncFn[Symbol.toStringTag] === "AsyncFunction" ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(FF์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)?

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ํ‘œ์ค€ ECMA ์‚ฌ์–‘ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€ asyncFn[Symbol.toStringTag] ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ cb(err, arg) ํ˜•์‹์˜ ์ฝœ๋ฐฑ์„ ์ œ๊ณตํ•  ๋•Œ๋งˆ๋‹ค ์ œ์•ˆ์ด AsyncFunction์ธ์ง€ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” promisify๋ฅผ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์•ฝ๊ฐ„ ๋’ค๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐ˜๋ณต ํ•จ์ˆ˜( function(args..., callback) {} )๋ฅผ ์ˆ˜๋ฝํ•  ๋•Œ๋งˆ๋‹ค async ํ•จ์ˆ˜์ธ์ง€ ํ™•์ธํ•œ ๋‹ค์Œ asyncify $ ํ•จ์ˆ˜์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

await ์˜ˆ์ œ๋Š” Async ๋ฉ”์„œ๋“œ๋ฅผ await ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค. Async ๋ฉ”์„œ๋“œ๊ฐ€ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋„๋ก ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋„๋ก ๋†”๋‘์‹ญ์‹œ์˜ค.

๋ชจ๋“  10 ๋Œ“๊ธ€

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ข€ ๋” ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋” ์ž˜ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ ์ธ ์งˆ๋ฌธ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Object.getPrototypeOf(asyncFn)[Symbol.toStringTag] === "AsyncFunction" ๋ฅผ ํ•  ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด asyncFn[Symbol.toStringTag] === "AsyncFunction" ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(FF์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)?

๋ˆ„๊ตฐ๊ฐ€ cb(err, arg) ํ˜•์‹์˜ ์ฝœ๋ฐฑ์„ ์ œ๊ณตํ•  ๋•Œ๋งˆ๋‹ค ์ œ์•ˆ์ด AsyncFunction ์ธ์ง€ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ promisify ๋ฅผ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” await ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ AsyncFunction ์ž„์„ ๊ฐ์ง€ํ•˜๋ฉด await ์ง€์›์˜ ์–ด๋ ค์›€์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Object.getPrototypeOf(asyncFn)[Symbol.toStringTag] === "AsyncFunction" ๋ฅผ ํ•  ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด asyncFn[Symbol.toStringTag] === "AsyncFunction" ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(FF์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค)?

๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ํ‘œ์ค€ ECMA ์‚ฌ์–‘ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€ asyncFn[Symbol.toStringTag] ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ cb(err, arg) ํ˜•์‹์˜ ์ฝœ๋ฐฑ์„ ์ œ๊ณตํ•  ๋•Œ๋งˆ๋‹ค ์ œ์•ˆ์ด AsyncFunction์ธ์ง€ ๊ฐ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” promisify๋ฅผ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์•ฝ๊ฐ„ ๋’ค๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐ˜๋ณต ํ•จ์ˆ˜( function(args..., callback) {} )๋ฅผ ์ˆ˜๋ฝํ•  ๋•Œ๋งˆ๋‹ค async ํ•จ์ˆ˜์ธ์ง€ ํ™•์ธํ•œ ๋‹ค์Œ asyncify $ ํ•จ์ˆ˜์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

await ์˜ˆ์ œ๋Š” Async ๋ฉ”์„œ๋“œ๋ฅผ await ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค. Async ๋ฉ”์„œ๋“œ๊ฐ€ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋„๋ก ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋„๋ก ๋†”๋‘์‹ญ์‹œ์˜ค.

#1390์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ ๋ฐฐํฌ๋œ ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ด์ € ๋ฒ„์ „์„ ๋†’์ด์ง€ ์•Š๊ณ  ๊ทธ๋Ÿฐ ์ผ์„ ํ•  ๋•Œ๋Š” ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.

์ถ”์‹ : ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ํ•˜๋Š” ๋ชจ๋“  ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ˜„

์‚ฌ๊ฒฉ! ๊ณ ์žฅ๋‚œ ๊ฒƒ. ์ž์„ธํ•œ ๋‚ด์šฉ์ด ํฌํ•จ๋œ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ™˜๊ฒฝ?
๊ฐ์‚ฌ ํ•ด์š”!

2017๋…„ 4์›” 5์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 10:18 Manuel Valls Fernรกndez <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ ๋ฐฐํฌ๋œ ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค
๋ฉ”์ด์ € ๋ฒ„์ „์„ ๋†’์ด์ง€ ์•Š๊ณ  ๊ทธ๋Ÿฌํ•œ ์ผ์„ ํ•  ๋•Œ.

์ถ”์‹ : ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ํ•˜๋Š” ๋ชจ๋“  ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ˜„

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/caolan/async/issues/1386#issuecomment-291875817 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/ADUIEPNkTSOVuuiwucBVrH983X6B568Wks5rs6K3gaJpZM4Mf64R
.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค, ๊ทธ๊ฒƒ์€ ๋‚ด ๋นŒ๋“œ๋„ ๋ง์ณค์Šต๋‹ˆ๋‹ค ...

๋ฉฐ์น  ์ „์— ์ž‘๋™ํ–ˆ๋˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋˜ ํญํฌ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์ด ๋” ์ด์ƒ ํ•จ์ˆ˜์— ์ œ๊ณต๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— "cb is not function"๊ณผ ํ•จ๊ป˜ ์‹คํŒจํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 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/await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

async.autoInject({

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

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

์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜: autoInject ์ž‘์—… ํ•จ์ˆ˜์—๋Š” ๋ช…์‹œ์  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
/Users/alexamil/WebstormProjects/nabisco/cdt-now/node_modules/async/dist/async.js:2081:23์—์„œ
/Users/alexamil/WebstormProjects/nabisco/cdt-now/node_modules/async์—์„œ

@ORESoftware ์˜ˆ, async ํ•จ์ˆ˜๋Š” autoInject ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Chrome์— ๊ฒŒ์‹œํ•œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. conn1 ๋ฐ conn2 ๊ฐ€ undefined ์ด๋ฏ€๋กœ ์ตœ์ข… ์ฝœ๋ฐฑ์—์„œ ReferenceError ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋กœ ๋ณ€๊ฒฝํ•œ ํ›„

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

์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ async ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰