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);
}
๋ฌด์์ ์ถ์ฒํฉ๋๊น?
@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 ๋ฑ์ ๋ํด ์์ง ๋ชปํ๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์, @hargasinski ๋ ๋์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฑ๋ฅ์์ ์ด์ ๋ก Zalgo๋ก๋ถํฐ ์ฌ์ฉ์๋ฅผ ๋ณดํธํ์ง ์์ต๋๋ค.
ํ ๊ฐ์ง ๋จ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
async.nextTick
/async.setImmediate
/process.nextTick
/setImmediate
all์ ์ฌ์ฉํ๋ฉด ํจ์์ ์ ๋ฌํ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.