Async: ๊ธฐ๋Šฅ/์ง€์› - ๋นˆ ์ž‘์—… ์ง‘ํ•ฉ -> ๋‹ค์Œ ํ‹ฑ์—์„œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ตœ์ข… ์ฝœ๋ฐฑ?

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

async.map ๋˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋น„๋™๊ธฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ์งˆ๋ฌธ/๊ธฐ๋Šฅ ์š”์ฒญ์€ - ์ž‘์—… ๋ฐฐ์—ด/์„ธํŠธ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ๋น„๋™๊ธฐ๊ฐ€ ๋‹ค์Œ ํ‹ฑ์—์„œ ์ตœ์ข… ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ async์— ๊ทธ๋ ‡๊ฒŒ ํ•˜๋„๋ก ์ง€์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ข‹์€ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚ด ์ฝ”๋“œ์— ์ด ํ•ญ๋ชฉ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋” ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค.

async.map([], function(item,cb){

}, function final(err, results){
    process.next(function(){ 
      cb(err,results);
   });
});

Zalgo๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ์œ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.

async.map([], function(item,cb){

}, cb);

์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€๋Š” ๋ฐฐ์—ด์ด ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ทธ๋ ‡๋‹ค๋ฉด

if(![].length){
   return process.next(cb);
}

๋ฌด์—‡์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๊นŒ?

question

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

์˜ˆ, @hargasinski ๋Š” ๋ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ Zalgo๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋‹จ์ˆœํ™”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate all์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@ORESoftware๋‹˜ , ์งˆ๋ฌธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋นˆ ๋ฐฐ์—ด/์„ธํŠธ์˜ ๊ฒฝ์šฐ async ๋Š” ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ๋‚ด์žฅ ์ง€์—ฐ์ด v2.0.0 ์—์„œ ์ œ๊ฑฐ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ํ‹ฑ์—์„œ ์ตœ์ข… ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค( async < v2.0.0 ์ด ๊ฒฝ์šฐ์—๋„ ๊ธฐ๋ณธ ์ œ๊ณต ์—ฐ๊ธฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.)

๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ async.map ๋ฅผ async.ensureAsync ๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

async.ensureAsync(async.map)([], function(item, cb) {

}, cb);

๋˜๋Š” ์ฝ”๋“œ ์‹œ์ž‘ ๋ถ€๋ถ„์˜ ์–ด๋”˜๊ฐ€:

const asyncMap = async.ensureAsync(async.map);
// then call `asyncMap` just as you would `async.map`

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ œ์•ˆํ•œ process.nextTick ์ ‘๊ทผ ๋ฐฉ์‹์ด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ async.setImmediate ๋˜๋Š” async.nextTick ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, @hargasinski ๋Š” ๋ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ Zalgo๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋‹จ์ˆœํ™”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate all์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค ์ข‹์•„, ๋‚˜๋Š” process.nextTick ๋“ฑ์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค.

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