web-dev-qa-db-ja.com

promiseでエラーを処理するにはどうすればよいですか?

ノードプログラマとして。私はコードのエラーを処理するために「ノードバック」を使用するのに慣れています:

myFn(param, function(err, data) {
    if (err){
        //error handling logic
     }
     else {
        // business logic
    }
});

その関数を書くとき、私は次のようなことができます:

var myFn = function(param, callback){
    var calc = doSomeCalculation(param);
    if(calc === null) { // or some other way to detect error
        callback(new Error("error with calculation"), null);
    }
    ...
    someAsyncOp(calcN,function(err, finalResult){
        if(err) return callback(err, null);
        callback(null, finalResult); // the error is null to signal no error
    });

};

約束でこの種のエラー処理を行うにはどうすればよいですか?

21

経験則

約束で何かをする方法について疑問があるときはいつでも、同期バージョンについて考えてください。

try{
   var result = myFn(param);
   // business logic with result
} catch(e) {
    //error handling logic
}

これは、少なくともnullである最初のパラメーターを持つコールバックよりも、少なくとも私にとってはずっときれいに見えます。

約束の方法は、ほとんどの場合、問題の同期バージョンと非常によく似ています。

myFn(param).then(function(result){
    // business logic with result
}).catch(function(e){
    //error handling logic
});

コールバックを操作する場合、myFnは次のようになります。

var myFn = function(param){
    return new Promise(function(resolve, reject){
        var calc = doSomeCalculation(param);
        if(calc === null) { // or some other way to detect error
            reject(new Error("error with calculation"), null);
        }
        someAsyncOp(calcN,function(err, finalResult){
            if(err) reject(err);
            resolve(finalResult);
        })
    });
};

コールバック/ノードバックの使用

これは、コールバックを操作するときにしなければならないことだけです。Promiseを操作するときは、はるかに簡単で、次のことができます。

var myFn = function(param){
    var calc = doSomeCalculation(param);
    ...
    return someAsyncOp(calcN); // returning a promise.
}

さらに、Promiseチェーン内で作業する場合、スローの安全性が得られます。

myFn(param).then(function(calcN){
   // here, you throw to raise an error and return to resolve
   // new Promise should be used only when starting a chain.
}).catch(function(err){
    // handle error
}).then(function(){
   // ready to go again, we're out of the catch
});

Bluebird[〜#〜]のような一部のライブラリrsvp [〜#〜] および [〜#〜] q [〜#〜] シンタックスシュガーとメソッドの自動約束を提供するため、new Promise自分。

また、 this および that を読んで、Promiseエラー処理の詳細を確認してください。

40