15

私は最終的にAngular promiseエラーの処理を停止しましたが、それは直感に反していました. エラーは失敗のコールバックによって処理されると思っていましたが、代わりにキャッチを使用する必要がありました。

失敗コールバックではなくキャッチが実行される理由が概念的によくわかりません。

私が期待したこと:

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. 
});

promise エラーを処理するためのより適切な方法がある場合は、お知らせください。

4

3 に答える 3

16

最初の引数を使用している間は、2 番目の引数をアプリケーション コードで文字どおりに使用することはほとんどありません。それは主に、異なる実装間でライブラリの相互運用性を約束することです。

.catch必要な特殊なコーナー ケースが特にない限り、常に使用する必要があり.then(succcess, fail)ます。

アンチパターンを参照してください.then(success, fail)

また、Q ライブラリ (Angular $q の基になっているもの)には、readme に同様のセクションがあります。

于 2013-10-25T21:12:18.027 に答える
7

promise の仕組みを少し誤解していると思います。

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

2 番目のコード ブロックには、実際に作業している 2 つの promise オブジェクトがあります。.then()「successCallback、errorCallback の戻り値を介して解決または拒否された新しいプロミスを返す」ことに注意してください。何が起こっているのかというと、 から返された 2 番目の promise からエラーをキャッチしているということですSomeAsyncService.getData().then(...)

于 2013-10-25T19:42:14.770 に答える
-1

$q のangularJSドキュメントによる:

メソッド

then(successCallback, errorCallback, notifyCallback) – Promise がいつ解決または拒否されたか、または今後解決または拒否されるかに関係なく、結果が利用可能になるとすぐに成功またはエラー コールバックのいずれかを非同期に呼び出します。

.....

catch(errorCallback) – promise.then(null, errorCallback) の省略形

投稿した 2 つのコードは同一です。

于 2013-10-25T17:57:23.337 に答える