コールバック辛くないですか?
とにかく上から順番に処理させたいだけなんだ!と言う人はこの型でやっていけば上から動きます。
この記事のポイントは、 あえて内容には触れないので5分ほどで上から動かせるようにすること
わざとすごく雑に書いています。とにかく上から動いてくれればそれで良いんだよ!って時の一助になれば幸い。
必要なモジュール
インストール
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 {
// 普通の時の処理
}
});
雑にやるとこんな感じでも上から順番に動く。