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


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

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

# 必要なモジュール
[co](https://www.npmjs.com/package/co)

## インストール

```
npm install co
```

## 使えるようにする

```
const co = require('co');
```

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

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

サンプル

```javascript:何も受け取らずに動く関数
function func_1() {
    // promiseで包む
    return new Promise((resolve) => {
        console.log('何かしたい処理はPromiseでくるんだ中に書く');
        
        let res = '処理が終わって結果を返したい場合は resolve()の中で返す。'
        // 関数の処理が終わったらresolve();する。
        resolve(res);
    });
}
```

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


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

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

### メイン部分では関数を ```co(function *() {})``` で包む
### 関数は変数に格納する
### ```yield``` と頭に付けて関数を実行する


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


雑にサンプル

```javascript: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の値を使って２番目の関数が処理をする
        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()とかわからん。。。だったら
エラーだったら、、、 __関数が返す値で判断すればいいじゃん。__

```javascript:エラーだった関数
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);
        }
    });
}
```


```javascript:エラー判別
　　// 関数はcoで包む
    co(function *() {
    // 1番目の処理
    let syori1 = yield func_1();
    
        // エラーを返すかもしれない処理
        let errorSyori = yield func_err
        if(errorSyori === 'error!') {
        	// エラー時の処理
        } else {
        	// 普通の時の処理
        }
    });
```

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