Async: ์ฝœ๋ฐฑ์ด ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2018๋…„ 02์›” 27์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: caolan/async

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);
}
feature feedback-wanted

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

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์•ฝ๊ฐ„ ์‹คํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ await Async.mapLimit(arr, 10, async foo => {...}) ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ 3.0์— ํฌํ•จ์‹œํ‚จ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ series , waterfall ์™€ ๊ฐ™์€ ์ผ๋ถ€ Async ๋ฉ”์„œ๋“œ๋Š” async/await ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฝค ์–ด๋ฆฌ์„์Šต๋‹ˆ๋‹ค.

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

์—ญ์‚ฌ์ ์œผ๋กœ 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);
};
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰