Async: 였λ₯˜λ₯Ό λ˜μ§€μ§€ μ•Šκ³  폭포수 μ‚¬μŠ¬ 끊기

에 λ§Œλ“  2011λ…„ 02μ›” 15일  Β·  8μ½”λ©˜νŠΈ  Β·  좜처: caolan/async

비동기 폭포수λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•΄μ•Ό ν•œλ‹€κ³  λ“€μ—ˆμŠ΅λ‹ˆλ‹€. λ„ˆλ¬΄ 깊이 λ“€μ–΄κ°€λŠ” μ—¬λŸ¬ 개의 μ—°κ²°λœ ν•¨μˆ˜κ°€ 있고 ν•¨μˆ˜ 등을 μž¬μ‚¬μš©ν•˜κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ— 주둜 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. μ—„λ°€νžˆ λ§ν•˜λ©΄ 였λ₯˜ 쑰건은 μ•„λ‹ˆμ§€λ§Œ 체인 μ•„λž˜μ˜ ν•œ 지점에 쑰건이 μžˆμŠ΅λ‹ˆλ‹€. μ“Έλͺ¨κ°€ μ—†κΈ° λ•Œλ¬Έμ— λ‚˜λ¨Έμ§€ 폭포 체인을 μ „λ‹¬ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 쿼리λ₯Ό μˆ˜ν–‰ν–ˆλŠ”λ° κ²°κ³Όκ°€ μ—†κ³  였λ₯˜κ°€ μ•„λ‹ˆλ©° κ²°κ³Ό 없이 λκΉŒμ§€ μ „νŒŒν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€. 비동기 없이 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 경우 "μ΅œμ’…" 콜백이 있고 λͺ…μ‹œμ μœΌλ‘œ 였λ₯˜λ₯Ό λ˜μ§€μ§€ μ•Šκ³  μ²΄μΈμ—μ„œ λ²—μ–΄λ‚˜λ„λ‘ 호좜될 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이 κΈ°λŠ₯은 ν­ν¬μˆ˜μ—λŠ” μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 이것을 κΉ”λ”ν•˜κ²Œ ν•  수 μžˆλŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ? λ‚΄κ°€ λ³Ό μˆ˜μžˆλŠ” μœ μΌν•œ 방법은 νŠΉλ³„ν•œ 였λ₯˜λ₯Ό λ˜μ§„ λ‹€μŒ μ΅œμ’… μ½œλ°±μ—μ„œ μ²˜λ¦¬ν•˜μ—¬ 였λ₯˜κ°€ μ•„λ‹Œ 것을 λ°˜ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

개인적으둜 이런 κΈ°λŠ₯이 ν•„μš”ν•˜κ³  핡심 λΌμ΄λΈŒλŸ¬λ¦¬μ— μΆ”κ°€λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

관심 μžˆλŠ” μ‚¬λžŒμ΄ 있으면 μ—¬κΈ° λ‚΄ λ„μš°λ―Έ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆλ‹€...

exports.breakWaterfall = function(tasks, callback){
    async.waterfall(tasks, function(){
        if(arguments[0] === 'break'){
            arguments[0] = null;
        }
        callback.apply(null, arguments);
    });
}

μž‘μ—… λ‚΄μ—μ„œ λ§ˆμ§€λ§‰ ν•¨μˆ˜λ‘œ 쀑단해야 ν•˜λŠ” 경우 done('break', other, arguments); 와 같이 μ½œλ°±μ„ ν˜ΈμΆœν•˜λ©΄ λ©λ‹ˆλ‹€.

λ„μš°λ―ΈλŠ” 'break' κ°μ§€ν•˜κ³  인수λ₯Ό λ³€κ²½ν•˜μ—¬ λ‚˜λ¨Έμ§€ μ½”λ“œμ—μ„œ 였λ₯˜μ²˜λŸΌ 보이지 μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.

λͺ¨λ“  8 λŒ“κΈ€

μ•ˆλ…•,

당신은 μ•„λ§ˆλ„ μ§€κΈˆκΉŒμ§€ 문제λ₯Ό ν•΄κ²°ν–ˆμ„ κ²ƒμž…λ‹ˆλ‹€. btw 이것은 λ‚΄ μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€.

var flow = [
    async.apply(...),
    // ...
];

async.waterfall(flow, function (err) {
    if (err === 'ok') return;
    // handle error
});

ν•¨μˆ˜κ°€ err = 'ok' λ₯Ό μ‚¬μš©ν•˜μ—¬ μ½œλ°±μ„ ν˜ΈμΆœν•˜λ©΄ 폭포수의 μ΅œμ’… 콜백이 이λ₯Ό κ°€λ‘œμ±•λ‹ˆλ‹€.

λΉ„μŠ·ν•œ λ¬Έμ œκ°€ 있으며 μ‚¬μš©ν•˜λŠ” λͺ¨λ“  폭포에 λŒ€ν•œ 였λ₯˜μΈμ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ 콜백 래퍼(ν”Όν•  수 있음)λ₯Ό μΆ”κ°€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜ μ΄μƒμ˜ ν­ν¬κ°€μžˆμ„ λ•Œ κΉ¨λ—ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
콜백 ν•¨μˆ˜ μžμ²΄μ— 'final'μ΄λΌλŠ” 또 λ‹€λ₯Έ 속성이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆκΉŒ? μ‚¬λžŒλ“€μ€ 이 속성을 ν˜ΈμΆœν•˜μ—¬ λκΉŒμ§€ 갈 수 μžˆμŠ΅λ‹ˆλ‹€.
같은 것

function search (cond, callback) {
  async.waterfall([function (cb) {
      db.get(cond, cb);
    },
    function (res, cb) {
      if (!res || !res.length)
        return cb.final();
      //do something useful
    }
  ], callback);
}

λ‚˜λŠ” μ½œλ°±μ„ κ°μŒ€ ν•„μš”κ°€ μ—†μœΌλ©° ν”„λ‘œκ·Έλž¨μ˜ λ‚˜λ¨Έμ§€ 뢀뢄에 연결될 수 μžˆμŠ΅λ‹ˆλ‹€.

@caolan @jnordberg pull request에 λŒ€ν•΄ λ§ˆμŒμ—

@tax : μ‹€μ œλ‘œ λ‹€μŒκ³Ό 같이 'error' = trueλ₯Ό μ „λ‹¬ν•˜μ—¬ μ΅œμ’… ν•¨μˆ˜λ‘œ κ±΄λ„ˆλ›Έ 수 μžˆμŒμ„ λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

async.waterfall([ν•¨μˆ˜(콜백) {
콜백(널); // <--- λ‹€μŒ fn으둜 이동
},
ν•¨μˆ˜(콜백) {
콜백(μ°Έ); // <--- λ§ˆμ§€λ§‰ fn으둜 κ±΄λ„ˆλ›°κΈ°
},
ν•¨μˆ˜(콜백) {
콜백(널); // <--- 이 fn은 ν˜ΈμΆœλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
}
], 콜백);

@tot2ivn 팁 κ°μ‚¬ν•©λ‹ˆλ‹€!

였λ₯˜λ₯Ό μ„€μ •ν•˜λ©΄ κ²°κ³Όκ°€ λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

var async = require('async');

async.waterfall( [
  function( callback ){
    console.log('one');
    callback( null );
  },

  function( callback ){
    console.log('two');
    callback( true, 'more info' );
  },

  function( callback ){
    console.log('three');
    callback( null );
  }
], function(err, result){
  console.log( err, result );
} );

// RESULT
// one
// two
// true undefined

pull request #85λ₯Ό 닫을 λ•Œ @caolan 의 μ˜κ²¬μ„

개인적으둜 이런 κΈ°λŠ₯이 ν•„μš”ν•˜κ³  핡심 λΌμ΄λΈŒλŸ¬λ¦¬μ— μΆ”κ°€λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

관심 μžˆλŠ” μ‚¬λžŒμ΄ 있으면 μ—¬κΈ° λ‚΄ λ„μš°λ―Έ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆλ‹€...

exports.breakWaterfall = function(tasks, callback){
    async.waterfall(tasks, function(){
        if(arguments[0] === 'break'){
            arguments[0] = null;
        }
        callback.apply(null, arguments);
    });
}

μž‘μ—… λ‚΄μ—μ„œ λ§ˆμ§€λ§‰ ν•¨μˆ˜λ‘œ 쀑단해야 ν•˜λŠ” 경우 done('break', other, arguments); 와 같이 μ½œλ°±μ„ ν˜ΈμΆœν•˜λ©΄ λ©λ‹ˆλ‹€.

λ„μš°λ―ΈλŠ” 'break' κ°μ§€ν•˜κ³  인수λ₯Ό λ³€κ²½ν•˜μ—¬ λ‚˜λ¨Έμ§€ μ½”λ“œμ—μ„œ 였λ₯˜μ²˜λŸΌ 보이지 μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰