あなたがで実証されているパターンを回避したい場合あなたの例はあなたのために2つの他のオプションがあるようです:
あなたのライブラリは、図のようにあなたのライブラリを正しく伝播し、正規化できる1つの関数を構築しますすべての既知のエラー:
var methodAFromLibX_Async = Promise.promisify(...);
var methodBFromLibY_Async = Promise.promisify(...);
methodAFromLibX_Async(...)
.then(function(result) {
return methodBFromLibY_Async(...)
.then(function(result) { ... })
})
.catch(function(err){
if (hasLibXShape(err)){
return Promise.reject(normalizeLibXErr(err));
} else if (hasLibYShape(err)){
return Promise.reject(normalizeLibYErr(err));
}
})
.catch(function(normalizedErr){
// handle normalized error
});
他のオプションは、手動で、あなたのライブラリー方法をpromisify、ここでエラーを正常化するために、次のようになります。あなたの最新のコメントを読む
function promisifiedMethodA(/*...args*/){
var args = [].slice.call(arguments);
return new Promise(function(resolve, reject){
methodA.apply(null, args.concat([function(err, data){
if (err) return reject(normalizeMethodAError(err));
resolve(data);
}]));
});
}
私は後者がより良いあなたのニーズに合うかもしれませんね。あなたが探しているソリューションは
return methodAFromLibX_Async(…)
.then(function(result) {
return methodBFromLibY_Async(…)
.then(function(result) {
return methodCFromLibX_Async(…)
.catch(normalizeAndThrowErrorFromLibX);
}, normalizeAndThrowErrorFromLibY);
}, normalizeAndThrowErrorFromLibX)
.then(reportSuccess, reportError);
である。しかし、これはかなりある
var methodAFromLibX_Async = Promise.promisify(...);
var methodBFromLibY_Async = Promise.promisify(...);
methodAFromLibX_Async(...)
.then(function(result) {
return methodBFromLibY_Async(...);
}).then(function(result) {
...
}).catch({code: 'X_Async', message: 'bad lib X'}, function(e) {
//If it is a methodAFromLibX_AsyncError, will end up here because
}).catch({code: 'Y_Async', message: 'bad lib Y'}, function(e) {
//Will end up here if a was never declared at all
}).catch(function(e) {
//Generic catch-the rest, error wasn't methodAFromLibX_AsyncError nor
//methodBFromLibY_AsyncError
});
出典
2016-09-26 09:16:25
m90
すると、あなたはすべての可能なエラーを正常化するあなたのチェーンの最後に単一 'catch'を持っているし、それらを「送信」することはできません何らかの理由があります? – m90
コメントありがとうございました@ m90。最後にはグローバルな 'catch' /' catchAll'だけで、エラーの起源についての知識は失われています。私の例で説明したように、さまざまなlib呼び出しからエラーが発生した場合、 'if..else'ブロックの束を使って、私は元を推測することができます。しかし、チェーン内で同じlibのメソッドをいくつか呼び出すと、トレースを戻すのがより複雑になります。私はもっと優雅なやり方がないと信じられません。 –
あなたはあなたが望む鎖ですか? 'normErrorFromY'は' normErrorFromX'のエラーを処理しますか? – Bergi