ES2017 async/await ๊ฐ๋ฐ์ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
const asyncjs = require('async');
const foo = async () => {
const arr = Array.from({ length: 1000 }, (v, i) => i);
const transformedArr = await asyncjs.mapLimit(arr, 100, async (v) => {
return await Promise.resolve(v * 2);
});
console.log(transformedArr);
}
์ญ์ฌ์ ์ผ๋ก async
๋ ์ด์ ๋ฐ๋ํ์ต๋๋ค(#1086 ์ฐธ์กฐ).
๊ทธ๋ฌ๋ ์๋ก์ด async/await
๊ตฌ๋ฌธ, ๋ฏธ๋์ ์ฝ์ API๋ฅผ ์ถ๊ฐํ๋ ๋
ธ๋ , ๊ทธ๋ฆฌ๊ณ ์ฝ์์ ๋ํ ์ง์์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋๋ ์ด๊ฒ์ ๋ค์ ๋ฐฉ๋ฌธํ ์ ์์ต๋๋ค. @aearly @megawac์ ๋ํ ์๊ฐ?
๋๋ ์ด๊ฒ์ ๋ํด ์๊ฐํ๊ณ ๊ทธ๊ฒ์ ์ฝ๊ฐ ์คํํ์ต๋๋ค. ์ฌ๋๋ค์ await Async.mapLimit(arr, 10, async foo => {...})
๋ฅผ ์ํ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ 3.0์ ํฌํจ์ํจ ๊ฒ์ผ ์ ์์ต๋๋ค.
๋ํ series
, waterfall
์ ๊ฐ์ ์ผ๋ถ Async ๋ฉ์๋๋ async/await ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฝค ์ด๋ฆฌ์์ต๋๋ค.
Async๋ฅผ ์ฌ์ฉํ ๋ ์์ฐ์ค๋ฝ๊ฒ Promise์ ๋ฐํ์ ๊ฐ์ ํ์ต๋๋ค. ์ฝ๋ฐฑ ๊ตฌ์กฐ๋ฅผ ์์์ฐจ๋ฆฐ ๊ฒ์ ๋ด ์ฝ๋์ ๋ฃจํด rtfm์ด ์๋ํ์ง ์๋ ์๊ฐ์ด์์ต๋๋ค. ์์ ์ฝ๋๋ ๊ฐ๋ฅํ ํ ๊ท ์ผํ ES7๋ก ์ฝ๋๋ฅผ ์ ์งํ๋ฏ๋ก ๋งค์ฐ ํ์ํ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ ์ฉํ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๊ทธ ์ฌ์ด์ ์ง๊ธ ๋งํ ์ฌ๋์ด ์๋ค๋ฉด ์ด ๊ธฐ์ฌ๊ฐ await๋ฅผ ์ฌ์ฉํ์ฌ forEach ๋ฃจํ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ ๋ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
https://codeburst.io/javascript-async-await-with-foreach-b6ba62bbf404
๋ง์นจ๋ด ๋ด ์ค๋๋ ์คํ์ ํํค์ณค์ต๋๋ค: #1526
+1
function makeAsync() {
if (arguments.length < 3) return; // wrong params, not run or throw exception here!
let fixParams = {};
let paramLength = arguments.length;
let method = arguments[0];
for (let i = 1; i < arguments.length; i++) {
fixParams[(i - 1)] = arguments[i];
}
return new Promise((resolve, reject) => {
const callback = (err, result) => {
if (err) return reject(err);
return resolve(result);
};
fixParams[paramLength - 1] = callback;
fixParams.length = paramLength;
method.apply(null, fixParams);
});
}
์ 1:
await makeAsync(async.each, openFiles, async (file) => {
await asyncOperation(file);
});
์2:
const foo = async () => {
const arr = Array.from({ length: 1000 }, (v, i) => i);
const transformedArr = await makeAsync(async.mapLimit, arr, 100, async (v) => {
return await Promise.resolve(v * 2);
});
console.log(transformedArr);
}
@tritoanst , ๊ทํ์ ์ฝ์ ๊ธฐ๋ฅ์ ์ค๋ฒ ํค๋์ ๋๋ค. ๋ ์ฌ์ธ ์ ์์ต๋๋ค.
function promisify(original) {
return function (...args) {
return new Promise((resolve, reject) => {
args.push((err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
original.apply(this, args);
});
};
}
const foo = async () => {
const arr = Array.from({ length: 1000 }, (v, i) => i);
const transformedArr = await promisify(async.mapLimit)(arr, 100, async (v) => {
return v * 2; // `return await` is redundant
});
console.log(transformedArr);
};
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋๋ ์ด๊ฒ์ ๋ํด ์๊ฐํ๊ณ ๊ทธ๊ฒ์ ์ฝ๊ฐ ์คํํ์ต๋๋ค. ์ฌ๋๋ค์
await Async.mapLimit(arr, 10, async foo => {...})
๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ 3.0์ ํฌํจ์ํจ ๊ฒ์ผ ์ ์์ต๋๋ค.๋ํ
series
,waterfall
์ ๊ฐ์ ์ผ๋ถ Async ๋ฉ์๋๋ async/await ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฝค ์ด๋ฆฌ์์ต๋๋ค.