ノードプログラマとして。私はコードのエラーを処理するために「ノードバック」を使用するのに慣れています:
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
});
};
約束でこの種のエラー処理を行うにはどうすればよいですか?
約束で何かをする方法について疑問があるときはいつでも、同期バージョンについて考えてください。
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
自分。