LoginSignup
5
2

More than 5 years have passed since last update.

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

Posted at

コールバック辛くないですか?
とにかく上から順番に処理させたいだけなんだ!と言う人はこの型でやっていけば上から動きます。
この記事のポイントは、 あえて内容には触れないので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 {
            // 普通の時の処理
        }
    });

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

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2