unhurried

コンピュータ関連ネタがほとんど、ときどき趣味も…

Callback地獄対策 (1) Promise

NodeJSで非同期処理を書いていくと必ずはまるのが、Callbackで階層が深くなりすぎるいわゆるCallback地獄です。対策を調べてみたところ色々ありすぎて混乱してきてしまったので、何回かに分けて整理してみようと思います。

今回は、非同期処理を行う関数でCallbackを引数にとる代わりに、実行状態を保持するPromiseオブジェクトを返却する方法をまとめてみました。

// Promiseを返却する関数の例
var promiseFunction = function(message, timeout) {
    // Promiseオブジェクト生成時の引数に
    // resolve、rejectを引数に持つFunctionを渡す
    // * resolve: 処理成功時の返却オブジェクトを渡す関数
    // * reject: 処理失敗時のエラーオブジェクトを渡す関数
    return new Promise(function(resolve, reject){
        setTimeout(function() {
            console.log(message);
            resolve(message);
            // エラー発生時はreject関数を呼び出す
            // reject(error);
        }, timeout);
    });
};

// Promiseインスタンスの使い方
var promise = promiseFunction('promise', 100);
// then関数:後処理を記述する
promise.then(function(result){
    console.log("result: " + JSON.stringify(result));
// catch関数:エラー処理を記述する
}).catch(function(error){
    console.log("error: " + JSON.stringify(error));
});

実行結果

$ node promise.js
promise
result: "promise"

参考: http://qiita.com/koki_cheese/items/c559da338a3d307c9d88