Async: async.auto ์ฒด์ธ ๋‚ด์—์„œ async / await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด TypeError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค : ์ฝœ๋ฐฑ์€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

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

์–ด๋–ค ๋ฒ„์ „์˜ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
2.6.1

(๋…ธ๋“œ ๋ฒ„์ „ / ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „)์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ํ™˜๊ฒฝ
8.11.3

๋ญ ํ–ˆ์–ด?
fileObj๊ฐ€ ์™ธ๋ถ€์—์„œ ์ œ๊ณต๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

async.auto({
  download: (downloadCB) => {
    if (fileObj) {
      fs.writeFile(__dirname + โ€˜fileNew.txtโ€™, fileObj.content, 'base64', function (err) {
        if (err){
          return downloadCB(err);
        }
        return downloadCB(null , fileObj.generatedFileName); // works fine
      });
    } else {
      let err = new Error('File not found');
      return downloadCB(err);
    }
  },
  collectData: ['download', async (results, collectCB) => {
    console.log(typeof collectCB); // prints undefined
    console.log(typeof results); // prints correct object

    let res = await anHttpRequest();
    if (res.response && res.response.statusCode == 200) {
      return collectCB(null , 'fileCombined.txt'); // This is where the ISSUE happens
    }
    else if(res.response.statusCode >= 300) {
      return collectCB(new Error('Request failed inside async-auto'));
    }
  }],

  filterData: ['collectData', (results, filterCB) => {
    doFilter(results.collectData, filterCB);
  }],
})

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ ํ–ˆ์Šต๋‹ˆ๊นŒ?
collectData ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด filterData๊ฐ€ collectCB ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ „๋‹ฌ ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์‹คํ–‰์„ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
TypeError : collectCB๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฒ„์ „ 2.0.1์—์„œ๋„ ์ž˜ ์‹คํ–‰๋˜์ง€๋งŒ 2.6.1๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•œ ํ›„ ์ž‘๋™์ด ์ค‘์ง€๋˜์—ˆ์œผ๋ฉฐ ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋„ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

docs question

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

async ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰ํ•˜๋ฉฐ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  return ๊ฐ’ (๋˜๋Š” throw ์˜ค๋ฅ˜)

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

async ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰ํ•˜๋ฉฐ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  return ๊ฐ’ (๋˜๋Š” throw ์˜ค๋ฅ˜)

์˜ˆ, StackOverflow์—์„œ ๋™์ผํ•œ ๋‚ด์šฉ์„ ๋ฐฐ์› ์œผ๋ฏ€๋กœ ์•ž์œผ๋กœ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌ ํ•  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์—ฌ๊ธฐ์— ๋™์ผํ•œ ์ฐธ์กฐ๋ฅผ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค. Using-async-await-inside-async-auto-chain

์ด๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ ์ธ ๊ฒฝ์šฐ async.parallel์—๋„ ์ ์šฉ๋˜๋ฉฐ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌธ์„œ์™€ ์˜ˆ์ œ์— ์ถ”๊ฐ€๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

        async.parallel({
            // NOTE: for async functions just return value or throw error
            // don't use the callback
            dates: async function(callback) {
                var rr = await getDates(dbName, r.indi, idx);
                return rr;
             },
             sdates: async function(callback) {
                  var rr = await getDates(dbName, r.spouse, idx);
                  return rr;
             },
             cdates: async function(callback) {
                  var rr = await getDates(dbName, r.cindi, idx);
                  return rr;
             }
        },
        function(err, results) {
             console.log(results);
        });

๋” ๋งŽ์€ async / await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€๊ธˆ ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์„ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ์˜ ๋งŽ์€ ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ํŒจํ‚ค์ง€์˜ ๊ธฐ๋Šฅ ์ด์ƒ์œผ๋กœ ๋ฌธ์„œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋” ๋งŽ์€ ์˜ˆ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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