Async: Node 6.2.2 "์ฝœ๋ฐฑ์ด ์ด๋ฏธ ํ˜ธ์ถœ๋จ"๊ณผ ํ•จ๊ป˜ Async๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ

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

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

3.9.5

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

๋…ธ๋“œ 6.2.2 ๋ฐ 5.0.71.52

๋ญ ํ–ˆ์–ด?

์ด ์•ฑ

var fs = require('fs'),
    async = require('async'),
    _dir = './data/';

var writeStream = fs.createWriteStream('./log.txt',
      {'flags' : 'a',
       'encoding' : 'utf8',
       'mode' : 0666});

async.waterfall([
   function readDir(callback) {
      fs.readdir(_dir, function(err, files) {
         callback(err,files);
      });
   },
   function loopFiles(files, callback) {
      files.forEach(function (name) {
         callback (null, name);
      });
   },

   function checkFile(file, callback) {
      fs.stat(_dir + file, function(err, stats) {
         callback(err, stats, file);
      });
   },
   function readData(stats, file, callback) {
      if (stats.isFile())
         fs.readFile(_dir + file, 'utf8', function(err, data){
           callback(err,file,data);
       });
   },
   function modify(file, text, callback) {
      var adjdata=text.replace(/somecompany\.com/g,'burningbird.net');
      callback(null, file, adjdata);
   },
   function writeData(file, text, callback) {
       fs.writeFile(_dir + file, text, function(err) {
          callback(err,file);
       });
   },

   function logChange(file, callback) {
       writeStream.write('changed ' + file + '\n', 'utf8',
                       function(err) {
          callback(err);
      });
   }
], function (err) {
         if (err) {
            console.log(err.message);
         } else {
            console.log('modified files');
         }
});

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ์Šต๋‹ˆ๊นŒ?

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก

์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ์–ด๋• ๋‚˜์š”?

๋‚˜๋Š” ์ ์ 

/home/examples/public_html/learnnode2-examples/chap3/node_modules/async/dist/async.js:837
if (fn === null) throw new Error("์ฝœ๋ฐฑ์ด ์ด๋ฏธ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
^^

์˜ค๋ฅ˜: ์ฝœ๋ฐฑ์ด ์ด๋ฏธ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ์˜ ๋‹ค์Œ ์„น์…˜์— ์žˆ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜

function loopFiles(ํŒŒ์ผ, ์ฝœ๋ฐฑ) {
files.forEach(ํ•จ์ˆ˜(์ด๋ฆ„) {
์ฝœ๋ฐฑ(null, ์ด๋ฆ„);
});
},

2์ฐจ์ „์—์„œ ํŒจ๋ฐฐ.

์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ Node.js๋ฅผ ํ†ตํ•ด ์ด ์ฝ”๋“œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ 6์ด ์ฒ˜์Œ ์ถœ์‹œ๋˜์—ˆ์„ ๋•Œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต์—์„œ ํ•จ์ˆ˜๋Š” null์ด ์•„๋‹ˆ์ง€๋งŒ ๋น„๋™๊ธฐ ์ฝ”๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

question

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

์—ฌ๊ธฐ์—์„œ ์ฝœ๋ฐฑ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—:

function loopFiles(files, callback) {
    files.forEach(function(name) {
        callback(null, name);
    });
},

์ด ๊ฒฝ์šฐ async.forEach๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํฅ๋ฏธ๋กœ์šด. ์ด์ „ ๋ฒ„์ „์˜ Node์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๊ณ  ์‹ค์ œ๋กœ Windows ์‹œ์Šคํ…œ์˜ Node 6.0.0์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ 6.0.0๊ณผ 6.2.2 ์‚ฌ์ด์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ๋‚ด์žฅ forEach๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Async๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ async.forEach๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถฉ๋Œํ•˜์ง€ ์•Š์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

   function loopFiles(files, callback) {
      async.forEach(files, function (name, callback) {
         callback (null, name);
      });
   },

์†”์งํžˆ ๋งํ•ด์„œ forEach๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

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

Linux์—์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Windows์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@shelleyp ํญํฌ๊ฐ€ ์—ฌ๋Ÿฌ ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ถ€์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‘ ๊ฐœ์˜ ํญํฌ๋กœ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฐฐ์—ด์„ ๊ธฐ๋Œ€ํ•˜๊ฒŒํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

async.forEach ๋ณ€๊ฒฝ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” loopFiles ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์€ ์–ด์จŒ๋“  ์›ํ•˜๋Š” ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. firstFile ๋ณ€๊ฒฝ loopFiles๋ฅผ (files, callback) => callback(null, files[0]) ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด checkFiles , readData ๋ฐ modify ๋ฐฐ์—ด์„ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ๋‘ ๋ฒˆ์งธ ํญํฌ ์ƒ์„ฑ).

๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ ์ด๊ฒƒ์ด checkFiles ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

async.waterfall([
   function readDir(callback) {
      fs.readdir(_dir, callback);
   },

   function checkFile(files, callback) {
      async.map(files, (file, cb) => {
         fs.stat(_dir + file, function(err, stats) {
            cb(err, {stat: stats, file: file});
         });
      }, (err, stats) => {
         callback(err, stats);
      });
   },

....

๊ดœ์ฐฎ์•„.

์ด๊ฒƒ์€ 6.2.2๊นŒ์ง€ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๋‚ด ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์›์ธ์ด ๋ฌด์—‡์ด๋“  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•ด์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ readdir ๋ชฉ๋ก์ด
ํ•˜๋‚˜์˜ ํŒŒ์ผ(0๊ฐœ์˜ ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋„ ์†์ƒ๋จ).

๋‘ ๋ฒ„์ „์˜ nod ๋ชจ๋‘์—์„œ readdir์˜ ์ถœ๋ ฅ์„ ๋‹ค์‹œ ํ™•์ธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
2016๋…„ 6์›” 27์ผ ์˜คํ›„ 5์‹œ 55๋ถ„์— "Shelley Powers" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์•„.

์ด๊ฒƒ์ด 6.2.2๊นŒ์ง€ ์ž‘๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ์ฝ”๋“œ๊ฐ€
๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ์—ฌ๋Ÿฌ ํŒŒ์ผ์—์„œ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, Linux์—์„œ 6.2.2๊นŒ์ง€.

๊ทธ๋Ÿฌ๋‚˜ ๋ฐฉ๊ธˆ Windows์—์„œ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ค, 4๊ฐœ์˜ ํŒŒ์ผ๋กœ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.

readdir์˜ ์ถœ๋ ฅ์€ [ 'data1.txt', 'data2.txt', 'data3.txt', 'data4.txt' ]์ž…๋‹ˆ๋‹ค.

loopFiles์— ๋Œ€ํ•œ ์ž…๋ ฅ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์‹œ์ ์—์„œ forEach๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ฝœ๋ฐฑ์€ ๊ฐœ๋ณ„ ํŒŒ์ผ ์ด๋ฆ„์„ ์–ป์Šต๋‹ˆ๋‹ค.

์–ด๋ ˆ์ด๊ฐ€ ์žˆ๋Š” ๋ฒฝ๋Œ ๋ฒฝ์— ๋ถ€๋”ชํžŒ ์ ์ด ์žˆ์—ˆ๋‹ค๋ฉด ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ฐฐ์—ด ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„์งœ ๋ฌธ์ œ๋Š” ํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Node, V8 ๋ฐ Async๋Š” ๋™์ผํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๋…ธ๋“œ 6.0.0 ๋ฐ 6.2.2์˜ Ubuntu 16.04์—์„œ ์•ฝ๊ฐ„ ์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

  • data1.txt, ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ(data1.txt)
  • ์˜ค๋ฅ˜: ์ฝœ๋ฐฑ์ด ์ด๋ฏธ ํ˜ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •๋œ ์Šคํฌ๋ฆฝํŠธ:

var fs = require('fs'),
    async = require('async'),
    _dir = './data/';

async.waterfall([
   function readDir(callback) {
      fs.readdir(_dir, callback);
   },
   function loopFiles(files, callback) {
      files.forEach(function (name) {
         callback (null, name);
      });
   },
   console.log.bind(console)
], console.error)
$ ls data
> data1.txt  data2.txt

๊ทธ๋Ÿฌ๋‚˜ Windows์—์„œ๋Š” ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ๋น„๋™๊ธฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ข…๋ฃŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2016๋…„ 6์›” 27์ผ ์›”์š”์ผ ์˜คํ›„ 8:20 Shelley Powers [email protected]
์ผ๋‹ค:

๊ทธ๋Ÿฌ๋‚˜ Windows์—์„œ๋Š” ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

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