Generator, Co, Async 를 이용한 비동기 순차 실행시키기

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
});