2013-10-25 4 views
15

私はついにAngular promiseエラー処理をダウンさせましたが、それは私には直感的でした。私は失敗のコールバックによってエラーが処理されると予想しましたが、代わりにキャッチを使用しなければなりませんでした。Angularでは、約束のエラーとキャッチ関数の概念の違いは何ですか?

なぜ私は失敗のコールバックではなく、キャッチが実行されているのか、概念的には分かりません。

SomeAsyncService.getData().then(function (result) { 
    // The call is successful. 
    // Code in this block throws an error. 
}, function (error) { 
    // I expected to handle errors here. 
}); 

最終的に働いていた何を:私が期待したもの

SomeAsyncService.getData().then(function (result) { 
    // The call is successful. 
    // Code in this block throws an error. 
}).catch(function (error) { 
    // Where the error is actually caught. 
}); 

約束の誤りを処理する適切な方法がある場合は、教えてください。 angularJS documentation for $qことで

答えて

16

第2引数は、アプリケーションコードでは文字通り使用されることはほとんどありません。これは主に、さまざまな実装間の約束ライブラリの相互運用性に関するものです。

.then(succcess, fail)が必要な奇妙なコーナーケースが特にないかぎり、常に.catchを使用してください。

The .then(success, fail) anti-patternを参照してください。

またQライブラリ(1角度$ qをに基づいています)has similar section in their readme

-1

方法

、その後(successCallback、errorCallback、notifyCallback) - に関係なく、 の約束があったか、または解決または拒否され、その後、呼び出し、1成功の かエラー が利用可能になるとすぐに、非同期的にエラーコールバックを行います。

.....

キャッチ(errorCallback) - promise.thenための速記(ヌル、errorCallback)

あなたが投稿したコードの2枚は同じです。

+0

最初のものはエラーをキャッチしない、もう一つはありません。 – Jason

7

私はあなたが約束の仕方を少し誤解していると思います。

最初のコードブロックには約束オブジェクトが1つしかありません。それはSomeAsyncService.getData()です。その約束が解決されたため、errorCallbackはここでは呼び出されません。

2番目のコードブロックには、実際には2つの約束オブジェクトがあります。 .then()は "successCallback、errorCallbackの戻り値で解決または拒否された新しい約束を返します"ということに注意してください。だから、あなたはSomeAsyncService.getData().then(...)から返された2番目の約束からエラーをキャッチしています。

+0

直前の約束が失敗したにもかかわらず、チェーン内の何らかの約束がエラーを投げた場合にキャッチが実行された場合にのみ、失敗のコールバックが実行されると言うのは正確でしょうか? – Jason

+0

あなたは部分的に正しいです。チェーン内の以前の約束がエラーを投げ、そのエラーがまだ処理されていない場合、Catchは実行されます。 –

関連する問題