Explanation
Generator, Co, Async(유틸리티 모듈) 를 이용한 비동기 순차 실행시키기.
(세가지 방법이라 묶어서 적었지만.. 사실 셋은 많은 차이점을 가지고 있습니다. Generator는 ECMAscript2015에서 정의된 표준이고, Co는 Node에서 Generator를 편하게 사용할 수 있는? 또는 그밖의 몇가지 기능들을 지원하는 모듈이며, 이 글에서의 Async는 node나 browser에서 사용할 수 있는 다양한 메서드들을 지원하는 유틸리티 모듈입니다.
Generator (link: MDN) : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Generator
Co : https://github.com/tj/co
Async : https://caolan.github.io/async/
1. Generator
function helloWorld_Hello() {
setTimeout(() => {
iterator.next('Hello');
}, 1000);
}
function helloWorld_Space(text) {
setTimeout(() => {
iterator.next(text + ' ');
}, 1000);
}
function helloWorld_World(text) {
setTimeout(() => {
iterator.next(text + 'World');
}, 1000);
}
function* helloWorld() {
const hello = yield helloWorld_Hello();
const space = yield helloWorld_Space(hello);
const world = yield helloWorld_World(space);
console.log(world); // Hello World
return;
}
const iterator = helloWorld();
iterator.next();
2. Co
const co = require('co');
function helloWorld_Hello() {
return new Promise((resolve, reject) => {
setTimeout(() => {
return resolve('Hello');
}, 1000);
});
}
function helloWorld_Space(text) {
return new Promise((resolve, reject) => {
setTimeout(() => {
return resolve(text + ' ');
}, 1000);
});
}
function helloWorld_World(text) {
return new Promise((resolve, reject) => {
setTimeout(() => {
return resolve(text + 'World');
}, 1000);
});
}
co(function* () {
const hello = yield helloWorld_Hello();
const space = yield helloWorld_Space(hello);
const world = yield helloWorld_World(space);
console.log(world); // Hello World
return;
});
3. Async
const async = require('async');
function helloWorld_Hello(callback) {
setTimeout(() => {
callback(null, 'Hello');
}, 1000);
}
function helloWorld_Space(text, callback) {
setTimeout(() => {
callback(null, text + ' ');
}, 1000);
}
function helloWorld_World(text, callback) {
setTimeout(() => {
callback(null, text + 'World');
}, 1000);
}
async.waterfall([
helloWorld_Hello,
helloWorld_Space,
helloWorld_World,
], function (err, result) {
console.log(result); // Hello World
});



