Node.js

nodejsで上から順番に処理をさせるものすごく雑な方法

コールバック辛くないですか?
とにかく上から順番に処理させたいだけなんだ!と言う人はこの型でやっていけば上から動きます。
この記事のポイントは、 あえて内容には触れないので5分ほどで上から動かせるようにすること

わざとすごく雑に書いています。とにかく上から動いてくれればそれで良いんだよ!って時の一助になれば幸い。

必要なモジュール

co

インストール

npm install co

使えるようにする

const co = require('co');

上から順番に動かすための戦略その1

処理は関数化させる

関数化させた処理は必ず return new Promise((resolve, reject) => {}) で包む

サンプル

何も受け取らずに動く関数
function func_1() {
    // promiseで包む
    return new Promise((resolve) => {
        console.log('何かしたい処理はPromiseでくるんだ中に書く');

        let res = '処理が終わって結果を返したい場合は resolve()の中で返す。'
        // 関数の処理が終わったらresolve();する。
        resolve(res);
    });
}
何かの結果を受け取って動く関数
function func_2(request) {
    // promiseで包む
    return new Promise((resolve) => {
        // 受け取ったrequestを処理してresponseを返す
        let response = 'Response: ' + request

        // 関数の処理が終わったらresolve();する。
        resolve(response);
    });
}

こんな感じでやりたい処理は関数化します。

上から順番に動かすための戦略その2

メイン部分では関数を co(function *() {}) で包む

関数は変数に格納する

yield と頭に付けて関数を実行する

関数を順番に処理する
  // 関数はcoで包む
    co(function *() {
        // 1番目の処理。特にデータを受け取らないで動くものの場合
            // 変数の中で、yield を頭に付けて関数を動かす。
        let syori1 = yield func_1();
        // syori1の中に、resolve(res);で返したres = '処理が終わって結果を返したい場合は resolve()の中で返す。'が入る。

        // syori1が完了してから以下の処理が動く(上から順番に動く)

        // syori1の値を使って2番目の関数が処理をする
        let syori2 = yield func_2(syori1);
    });

雑にサンプル

index.js
const co = require('co');

console.log('func_1が動いてfunc_2が動く');
    co(function *() {
        // 1番目の処理。特にデータを受け取らないで動くものの場合
            // 変数の中で、yield を頭に付けて関数を動かす。
        let syori1 = yield func_1();
        // syori1の中に、resolve(res);で返したres = '処理が終わって結果を返したい場合は resolve()の中で返す。'が入る。
        // syori1が完了してから以下の処理が動く(上から順番に動く)
        console.log(syori1);

        // syori1の値を使って2番目の関数が処理をする
        let syori2 = yield func_2(syori1);
        console.log(syori2);
    });



function func_1() {
    // promiseで包む
    return new Promise((resolve) => {
        console.log('何かしたい処理はPromiseでくるんだ中に書く');

        let res = '処理が終わって結果を返したい場合は resolve()の中で返す。'
        // 関数の処理が終わったらresolve();する。
        resolve(res);

function func_2(request) {
    // promiseで包む
    return new Promise((resolve) => {
        // 受け取ったrequestを処理してresponseを返す
        let response = 'Response: ' + request

        // 関数の処理が終わったらresolve();する。
        resolve(response);
    });
}

順番に動かすことができました。

もっと詳しく知りたい人はこの記事が参考になると思います
http://qiita.com/hachi_eiji/items/d4a6e2683344a208c6d0

[読まなくても良い]エラーが起きたら

reject()とかわからん。。。だったら
エラーだったら、、、 関数が返す値で判断すればいいじゃん。

エラーだった関数
function func_err(request) {
    // promiseで包む
    return new Promise((resolve) => {
        // 受け取ったrequestを処理してresponseを返す
        let errorFlag = false;
        let response = 'Response: ' + request

        // 関数の処理が終わったらresolve();する。けどエラーが起こっちゃったことを返したい
        // エラーが起きたのでフラグ更新
        errorFlag = true;

        if(errorFlag) {
            // エラーだ
            resolve('error!');
        } else {
           // エラーじゃない
            resolve(response);
        }
    });
}
エラー判別
  // 関数はcoで包む
    co(function *() {
    // 1番目の処理
    let syori1 = yield func_1();

        // エラーを返すかもしれない処理
        let errorSyori = yield func_err
        if(errorSyori === 'error!') {
            // エラー時の処理
        } else {
            // 普通の時の処理
        }
    });

雑にやるとこんな感じでも上から順番に動く。