Async: ์ง€์› ์•ฝ์†

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

์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ˜ผํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋ผ๋ฏธ์Šค ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

async.waterfall([
    function (done) {
        // Do something and call done()
        fs.readFile(filepath, done);
    },
    function(content) {
        // Do something and return Promise
        return mongoose.models.file.create({
            name: filepath,
            content: content
        });
    }
], (err) => {
    if (err) {
        console.error(err);
    }
});

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

async.asyncify๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ async.promisify ๊ธฐ๋Šฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ async.promisify(async.mapLimit(x,10, mapper))๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

asyncify ๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•ด๊ฒฐ/๊ฑฐ๋ถ€๋œ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

async.waterfall([
    function (done) {
        // Do something and call done()
        fs.readFile(filepath, done);
    },
    async.asyncify(function(content) {
        // Do something and return Promise
        return mongoose.models.file.create({
            name: filepath,
            content: content
        });
    })
], (err, model) => {
    if (err) {
        console.error(err);
    }
});

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๊ธฐ๋Šฅ์€ ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ...

๋‚˜๋Š” ๋˜ํ•œ ๋˜ ๋‹ค๋ฅธ ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?). ES-whatever async ํ•จ์ˆ˜(์•”์‹œ์ ์œผ๋กœ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•จ)๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋น„๋™๊ธฐ๋Š” ๋ฌด์—‡์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ

async.waterfall([
    function (done) {
        // Do something and call done()
        fs.readFile(filepath, done);
    },
    async function(content) {
        return await mongoose.models.file.create({
            name: filepath,
            content: content
        });
    }
], (err, model) => {
    if (err) {
        console.error(err);
    }
});

๊ฐœ์ธ์ ์œผ๋กœ ๋น„๋™๊ธฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฝ์†์„ ๋น„๋™๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. async.queue์—๋„ ํ”ผ๋“œํ•ด์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

import {queue, asyncify} from 'async'

const run = asyncify(async function () {
  await someStuff()
})

const q = async.queue(run)
q.push('asdf')

๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ณณ

import {queue} from 'async'

async function run () {
  await someStuff()
}

const q = async.queue(run)
q.push('asdf')

asyncify ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ๋น„๋™๊ธฐํ™” ๋™์ž‘์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ์—ด์–ด ๋‘ก๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด Promise ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ํ™•์ธ !

async.waterfall([
  function (callback) {
    callback(null, 'one', 'two')
  },
  function (arg1, arg2, callback) {
    // arg1 now equals 'one' and arg2 now equals 'two'
    callback(null, 'three')
  },
  function (arg1, callback) {
    // arg1 now equals 'three'
    callback(null, 'done')
  }
]).then(function (value) {
  console.log(value === 'done')
})

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ป๊ฒŒ Works๊ฐ€ cb ๋ฐ promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋งค์šฐ ํฅ๋ฏธ๋กœ์šด. Async๊ฐ€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๋ฉด, Promise-ed Async ํ•จ์ˆ˜๋„ ๊ฝค ์‰ฝ๊ฒŒ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

async.parallel([
  async.waterfall([
    asyncFn1,
    function (result1, next) {
      //...
    }
    asyncFn2,
    //...
  ]), // no callback!
  async.each(arr, function (item, cb) {
    //...
  })
  otherAsyncFn
], done)

๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ๋ฌธ์ œ๋Š” ์ฝœ๋ฐฑ์ด ์„ ํƒ ์‚ฌํ•ญ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋ฅผ ์ƒ๋žตํ•ด๋„ ์—ฌ์ „ํžˆ ์ž‘์—…์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Async ํ•จ์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์ปค๋ฆฌ๋˜๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์„ ์ƒ๋žตํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉ๋˜๊ณ  ์ฝœ๋ฐฑ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ๋ฉ”์†Œ๋“œ์— ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๊ณ  ์šฐ๋ฆฌ๋Š” ์ „๋ฐ˜์ ์œผ๋กœ ์„ ํƒ์  ์ฝœ๋ฐฑ์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ฐฉ๋ฒ•์€ ๊ฐ€๋ณ€์ ์ด๋ฉฐ ๊ฐ€๋ณ€ ํ•จ์ˆ˜๋ฅผ ์ปค๋ฆฌ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์„œ๋“œ์—์„œ ๋งˆ์ง€๋ง‰ ์ฝœ๋ฐฑ์„ ์ƒ๋žตํ•˜๋ฉด Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  Async๊ฐ€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •๋œ ๊ฒฝ์šฐ ํฅ๋ฏธ๋กœ์šด ์ฝค๋ณด์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ฃผ์š” ๋ฌธ์ œ๋Š” Async๊ฐ€ Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ†ตํ•ฉ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋Š ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” global.Promise ์— ์˜์กดํ•ฉ๋‹ˆ๊นŒ, ๊ตฌํ˜• ์—”์ง„์ด ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด Bluebird์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ๋˜ํ•œ Async๋Š” Future ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ฑ„ํƒํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ฝœ๋ฐฑ์„ ์ˆ˜๋ฝํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ณ ์ฐจ ํ•จ์ˆ˜์ธ ์•ฝ์†์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์ง„์ˆ ์ž…๋‹ˆ๋‹ค. ์ €๋Š” Promises์™€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์œ„ํ•ด ๋ชจ๋‘ ์ฐฌ์„ฑํ•˜์ง€๋งŒ Async ๋ฐ˜ํ™˜ ์•ฝ์†์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋””์ž์ธ ์ฒ ํ•™์—์„œ ์•ฝ๊ฐ„ ๋ฒ—์–ด๋‚œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@์ผ์ฐ

๋‚˜๋Š” Promises๊ฐ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ๋ฒ„์ „(>=4)๊ณผ ์ผ์น˜ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์—์„œ๋Š” Promise๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ „์—ญ ํ™˜๊ฒฝ์— Promise๊ฐ€ ์žˆ์„ ๋•Œ Promise ์›Œํฌํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ ๋น„์ „์ž…๋‹ˆ๋‹ค.

์ž‘์€ ํด๋ฆฌํ•„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ( pinkie-promise ํ™•์ธ) ์ œ ์ƒ๊ฐ์—๋Š” ํด๋ฆฌํ•„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋…ธ๋“œ ๋ฒ„์ „์„ ๊ฐ•์ œ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ •๋ง, ํ™•์ธ(6๊ฐœ PR ํš๋“)[https://github.com/sindresorhus/got/pull/140]. ์ข…์†์„ฑ์€ ์•„์ฃผ ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ™˜์˜๋ฐ›์ง€ ๋ชปํ•˜๊ณ  ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ ๋ชจ๋“ˆํ™” ํ›„์— ํฌํ•จ๋˜์–ด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋” ์‰ฝ๊ฒŒ ์ ์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ถ„๋ช…ํžˆ ์•ฝ์†๊ณผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ _๋ฐ˜๋“œ์‹œ_!

@ํ‚ค์ฝ”๋น„์ธ  :+1:

Promise๋Š” ์ตœ๊ณ ์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์™„์ „ํ•œ ์ง€์› ์—†์ด ๋น„๋™๊ธฐ๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์ƒํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

polyfill ์—†์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋Šฅ ๊ฐ์ง€์™€ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. resolve ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์ „์—ญ Promise ๊ฐœ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

@aearly bluebird๋Š”

@martinheidegger Bluebird๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ํฝ๋‹ˆ๋‹ค. Promise ๋ฉ”์„œ๋“œ์˜ ๊ฐ„๋‹จํ•œ ์ง€์›์„ ์œ„ํ•ด 76Kb(์ถ•์†Œ)๋ฅผ ์บ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋ฐฑ์—”๋“œ ์›Œํฌํ”Œ๋กœ์—์„œ ์ฝœ๋ฐฑ ๋˜๋Š” ์•ฝ์† ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋…ธ๋“œ ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค.

  • ๋ฐฑ์—”๋“œ์— ๋” ๋งŽ์€ ์‹œ๊ฐ„(2๋…„ ์ด์ƒ, ์•„๋งˆ๋„)์ด ์žˆ๋Š” ๊ฒฝ์šฐ 0.10 ๋˜๋Š” 0.12 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ์ฝœ๋ฐฑ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ๊ฐ€ 6๊ฐœ์›” ๋ฏธ๋งŒ์ด๊ณ  >=4 ๋…ธ๋“œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋งˆ๋„ Promise ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ๋‹น์‹ ์€ ํ˜ผํ•ฉ ์Šคํƒ€์ผ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ง€์› Promise์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. async๊ฐ€ ๋ฏธ๋ž˜์˜ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด ๋…ธ๋“œ ๋ฒ„์ „์ด ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ: _๋‚˜๋Š” ์ด์ „ ๋…ธ๋“œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋‚ด ๋ฐฑ์—”๋“œ๋Š” promise ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค_. ๊ทธ๋Ÿฐ ๋‹ค์Œ Promises ๊ฐ์ฒด๋ฅผ ์ „์—ญ์œผ๋กœ ์ •์˜ ํ–ˆ๊ฑฐ๋‚˜

ํ”„๋ก ํŠธ์—”๋“œ ์ธก์—์„œ๋„ ๋™์ผํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์˜์กด์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ , 4-5๋…„ ์ „์— Promise๊ฐ€ ๊ฒช์—ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์ ์šฉ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋…ธ๋“œ 4 ์ด์ƒ๊ณผ ES6์„ ์ง€์›ํ•˜๋Š” ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€์ ์œผ๋กœ ์•ฝ์†์„ ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋…ธ๋“œ 0.12 ๋ฐ ์ด์ „ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์ž๋ฅผ ๋จผ์ง€ ์†์— ๋‚จ๊ฒจ๋‘๊ณ  ํด๋ฆฌํ•„์„ ์š”๊ตฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜๋ฅผ ๋ฌถ๊ณ  ์‹ถ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋ผ์†๊ฐ€๋ฝ ์•ฝ์†์—๋„ ๋ฌด๊ฒŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ‘œ์ค€ ES6 Promise ์™ธ๋ถ€์—์„œ Promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ๊ฐ„์— bluebird ๋˜๋Š” q ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋ฆฌํ•„์˜ ์‚ฌ์šฉ์„ ์š”๊ตฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค -- npm i -S async ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ํ•ด์•ผ ํ•  ์ผ์ž…๋‹ˆ๋‹ค.

Async๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์•ˆ์ธ Promise์— ๋Œ€ํ•œ ๋ฐ˜์‘์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. Promises๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์—์„œ ํ•œ ๊ฑธ์Œ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•˜๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š” ์ฝœ๋ฐฑ์€ ์•ฝ์†๋งŒํผ ๊ฐ•๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Promise์—๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„ ์ง€์—ฐ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค).

์ €๋Š” ์•ฝ์†๊ณผ์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์œ„ํ•ด ๋ชจ๋‘ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์•ฝ์†์ด๋‚˜ ๋‹ค๋ฅธ "์—ฐ๊ฒฐ ๊ฐ€๋Šฅ"์œผ๋กœ ์ „๋‹ฌ๋˜๋ฉด ํ™•์‹คํžˆ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”Œ๋žซํผ ์ „๋ฐ˜์— ๊ฑธ์นœ ES6 ์ง€์›์ด ์•„์ง ๊ฐˆ ๊ธธ์ด ๋ฉ€๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์— ๋‚ด๋ถ€์ ์œผ๋กœ Promise๋ฅผ ์ƒ์„ฑ ๋ฐ/๋˜๋Š” ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์•ฝ์†์€ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ ์ด๋Ÿฐ ๊ฒƒ์„ ์˜ตํŠธ์ธ ํ™•์žฅ์œผ๋กœ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•ฝ์†์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ํ•ญ์ƒ ์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

IMHO, ๋งŽ์€ ๋…ธ๋“œ ์ฝ”๋“œ๋ฅผ promise + co + yield๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ ํ›„ .eachLimit() ๋Œ€ํ•ด์„œ๋งŒ ์ง์ ‘ ๋Œ€์ฒด๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์œ ์šฉํ•œ ๊ฒฝ์šฐ ๋ชฉ๋ก์€ ์–ธ๋œป๋ณด๊ธฐ๋ณด๋‹ค ํ›จ์”ฌ ์ ๊ณ  ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @Kikobeats ์˜ ์ž‘์€ ํ™•์žฅ์„ ์ข‹์•„ ํ•˜๋Š”๋ฐ , readme(/cc @aearly)์—์„œ ์ถ”์ฒœํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‚˜์™€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ์ œ๊ธฐํ•œ ์ด์œ ๋กœ ๋น„๋™๊ธฐ์‹ Promise์˜ ๊ณต์‹ ์ง€์›์— ๋Œ€ํ•ด ๊ฐ•๋ ฅํžˆ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

@megawac ํ•จ์ˆ˜๊ฐ€ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด @SEAPUNK ์˜ ์˜ˆ.

@megawac I promise-async ์—์„œ ์ฝœ๋ฐฑ ์Šคํƒ€์ผ, ํ…Œ์ŠคํŠธ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ๋นŒ๋“œ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ˆ„๊ตฐ๊ฐ€ Promise๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.+1:

@aearly , ๊ดœ์ฐฎ์„ ๊ฒƒ
๊ฐœ์ธ์ ์œผ๋กœ ํ† ์ง€

2016๋…„ 1์›” 22์ผ ๊ธˆ์š”์ผ ์˜คํ›„ 2์‹œ 17๋ถ„, Kiko Beats [email protected]
์ผ๋‹ค:

@megawac https://github.com/megawac ์ฝœ๋ฐฑ ์Šคํƒ€์ผ ์ง€์› ์ถ”๊ฐ€
๋ฐ promise-async์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ
https://github.com/Kikobeats/promise-async#promise -async. ๊ทธ๋ ‡๋‹ค๋ฉด ๋งŒ์•ฝ
๋ˆ„๊ตฌ๋“ ์ง€ Promise๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์•„์š” [image: :+1:]

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/caolan/async/issues/956#issuecomment -174016628.

๋‹ค์Œ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์•ฝ์†ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.
https://github.com/eladnava/koa-async

async.asyncify๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ async.promisify ๊ธฐ๋Šฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ async.promisify(async.mapLimit(x,10, mapper))๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

2016๋…„ 12์›” 17์ผ ํ† ์š”์ผ ์˜คํ›„ 4์‹œ 57๋ถ„, Manoj Patel [email protected]
์ผ๋‹ค:

async.asyncify๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ async.promisify๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ.

๊ทธ๋Ÿฐ ๋‹ค์Œ async.promisify(async.mapLimit(x,10, mapper))๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

bluebird ๋ชจ๋“ˆ์˜ promisifyAll ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜๋„๋ก ์ฝœ๋ฐฑ์„ ์•ฝ์†์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

// adds '<original-method>Async' to class 
Promise.promisifyAll(async);

function somePromise() {
    return async.parallelAsync([
        function(cb) {
            setTimeout(function(){
                cb(new Error('err'), 'foo')
            }, 1000);
        },
        function(cb) {
            setTimeout(function(){
                cb(null, 'bar')
            }, 1000);
        }
    ]);
}

somePromise().then(function(result){
    console.log('result',result);
}).catch(function(err){
    console.log('err',err);
});

JSFiddle ์˜ˆ์ œ

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