설모의 기록

async.waterfall() 메소드 본문

언어/Javascript

async.waterfall() 메소드

HA_Kwon 2018. 1. 8. 01:21

  이번에는 비동기적인 코드에서 중첩된 콜백메소드 폭포를 처리해주는 async 모듈에 대해 알아보겠습니다. 아래의 예제는 node.js 프로젝트에서의 예시 코드입니다.


Async 모듈

  먼저, async 모듈을 사용하지 않고 중첩된 콜백메소드 코드를 보겠습니다.

1
2
3
4
5
6
7
callback1 (function () {
    callback2 (function () {
        callback3 (function () {
            console.log('세 개의 콜백메소드 수행');
        });
    });
});

  콜백메소드를 3개만 중첩해 놓은 것인데도 코드를 읽기에 매우 불편합니다. 코드가 점차 커지면 이러한 불편함은 더욱 커질 것입니다. 이러한 비동기 처리를 보기 쉽게 처리하는 모듈이 Async 입니다. 


  우선 Async 모듈을 사용하려는 프로젝트에서 모듈을 설치해줍니다. 

$ npm install -g async


  이 후, 사용하려는 파일에서 모듈을 선언해 줍니다.

const async = require('async');

이제 Async 모듈을 사용할 준비가 끝났습니다.



Async.waterfall() 메소드

  Async 모듈의 대표적인 예시는 async.waterfall(tasks, callback) 입니다. 아래의 예제를 살펴보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
const async = require('async');
 
var tasks = [
    taskFunc1,
    taskFunc2,
    taskFunc3
];
 
 
async.waterfall(tasks, fucnction (err, result) {
    if (err) { console.log('에러가 발생했습니다.', err.message); }
    else { console.log('일을 모두 수행했습니다.', result); }
} );

  tasks 는 수행해야할 메소드들을 배열로 가지는 변수입니다. tasks 에 들어있는 메소드들을 순차적으로 실행하며 이전 메소드에서 수행한 결과값을 다음 메소드로 넘길 수 있습니다. 만약 tasks 안에 들어있는 메소드를 실행하다 에러가 발생하면 그 이후의 메소드들은 수행되지 않습니다. 또한 발생한 에러는 waterfall 의 두번째 인자인 콜백메소드의 err 인자로 넘어오게 됩니다. tasks 의 메소드들을 에러 발생없이 순차적으로 모두 수행했다면 err값이 null 인 채로 waterfall 의 두번째 인자인 콜백메소드로 넘어오게 됩니다. 


  아래의 예제는 위의 예제를 응용한 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const async = require('async');
 
var wakeup = function (callback) {
    callback(null, ['세수하기']);
}
 
var eat = function (doing, callback) {
    callback(null, doing.concat(['밥먹기''양치질하기']));
}
 
var goToSchool = function (doing, callback) {
    callback(null, doing.concat(['버스타기''실내화신기']));
}
 
var comebackHome = funciton () {
    callback(null, doing.concat(['가방 내려놓기']));
}
 
 
var tasks = [
    wakeup,
    eat,
    goToSchool,
    comebackHome
];
 
async.waterfall(tasks, fucnction (err, result) {
    if (err) { console.log('에러가 발생했습니다.', err.message); }
    else { console.log('오늘 한 일 : ', result); }
} );

  tasks 배열 안에는 수행해야 할 비동기적 메소드들이 들어있습니다. 각 메소드에서 callback() 메소드를 실행하면 다음 메소드가 실행됩니다. 콜백메소드에는 인자를 넣을 수 있는데, 첫 번쨰 인자에 null 이 아닌 다른 값을 넣게 되면 이후의 메소드들은 수행되지 않고 waterfall() 의 두 번째 인자인 메소드의 err 인자로 넘어오게 됩니다. 따라서 중간에 에러가 발생하면 callback(error); 를 실행하면 되고, 에러가 발생하지 않았지만 이후 메소드들을 실행하고 싶지 않을 때는 callback('done'); 이런식으로 어떠한 값을 넣으면 waterfall 의 두번째 인자인 메소드가 실행됩니다. 위의 tasks 배열에 들어있는 메소드들은 에러를 발생하지 않으므로 순차적으로 실행된 뒤 waterfall() 의 두 번째 인자인 메소드로 들어옵니다. 

  따라서 오늘 한 일 :  ['세수하기', '밥먹기', '양치질하기', '버스타기', '실내화신기', '가방 내려놓기'] 가 출력됩니다.



Async 모듈의 다른 예시는 아래의 사이트에서 참고하시면 됩니다.

참고 사이트 : http://caolan.github.io/async/

'언어 > Javascript' 카테고리의 다른 글

jsonwebtoken 모듈  (0) 2018.01.16
nodemailer 모듈 사용하기  (0) 2018.01.13
bcrypt-nodejs 모듈 사용하기  (0) 2018.01.08
Map 과 Set  (0) 2018.01.04
싱글톤(singleton) 패턴  (0) 2017.12.16
Comments