Angular.js: $ httpサービスが400でエラーコールバックを呼び出さない

作成日 2013年05月08日  ·  26コメント  ·  ソース: angular/angular.js

バージョン:1.1.4

createNewWall: function(wall, successCallback, errorCallback) {
    return $http.post($rootScope.baseAppsAPI + '/walls', null, {
       params: wall
    }).success(function(data, status) {
       return successCallback.call(this, data);
    }).error(function(data) {
       return errorCallback.call(this, data);
    });
}

角度isSuccess関数が正しく機能していることを確認しました。 これをウィンドウオブジェクトに追加し、以下のコード(成功したコールバックに配置)によってエラーコールバックが呼び出されることを確認しました。

if (window.isSuccess(status)) {
   return successCallback.call(this, data);
} else {
  return errorCallback.call(this, data);
}

問題の原因について何か考えはありますか? $ httpで問題が発生すると、正しく拒否/解決されないことが約束されますか?

最も参考になるコメント

私にとっては、 @ lsiv568の回答者がそのトリックを行いました。 最初はちょっと奇妙ですが、エラーインターセプター(ソース)を作成するときに、拒否されたプロミスを手動で返す必要があります。

.factory('myInterceptor', function($q) {
  return {
    response: function (response) { return response; },
    responseError: function(response) {
      // do stuff or
      return $q.reject(response);
    }
  };
});

全てのコメント26件

私は同じ問題に直面しています。 問題を解決した方法は、私が何か間違ったことをしている可能性があることを意味している可能性があります。解決策を教えてください。 これはどこにも見つかりません。

ロバート。、

問題が(奇跡的に)消えたので、私は問題を閉じました
私のサービスにいくつかの変更を加えました。 しかし、戻ってきたようです
断続的に。 だから、それが私の側の問題なのか、それとも
角度に関する真の問題。 必要に応じて、問題を再開できます。
あなたの問題をそれに追加しますか? それはyoUで機能しますか?

9:13で月、2013年5月13日には、ロバートの[email protected]書きました:

私は同じ問題に直面しています。 あなたが問題を閉じた方法は私が意味するかもしれません
何か間違ったことをしている可能性があります。ソリューションを共有していただけますか? できません
これをどこでも見つけてください。


このメールに直接返信するか、Gi tHubhttps://github.com/angular/angular.js/issues/2609#issuecomment-17810417で表示してください

敬具、

Louis W. Sivillo

上記のように、断続的に発生するため、この問題を再開します。 rtpm、問題の特定に役立つ可能性のあるユースケース/追加情報を含めてください

ロバート、
これを送ってくれてありがとう。

応答エラーの約束を拒否しなかった基本認証用に作成したhttpインターセプターがありました。

皆さんのボットに感謝します。 私も同じ問題を抱えていました。

サーバーが401を返すと、+ 1が発生します

+1
サーバーが401ステータスコードを返す間、コールバック関数が機能しません。

これについて何か進展はありますか? 400で同じ問題に直面しています。

私にとっては、 @ lsiv568の回答者がそのトリックを行いました。 最初はちょっと奇妙ですが、エラーインターセプター(ソース)を作成するときに、拒否されたプロミスを手動で返す必要があります。

.factory('myInterceptor', function($q) {
  return {
    response: function (response) { return response; },
    responseError: function(response) {
      // do stuff or
      return $q.reject(response);
    }
  };
});

400で同じ問題に直面しています。
しかし、なぜ問題が解決されたのですか、この問題に対する特定の解決策はありますか?

私もエラー400でこの問題に直面しています。この問題は解決されましたか? もしそうなら、どのバージョンで?

299を超えるすべてのエラーで同じ問題が発生しています。 カスタム応答インターセプターでRestangularを使用していますが、CSRFトークンヘッダーを除いて、すぐに使用できる$ httpサービスでエラーが発生します。 (とにかく、Restangular内から遅延オブジェクトを手動で拒否しようとしましたが、予想どおり、何も変更されませんでした。)

私もこの問題に直面していますが、これを再開できますか?

元の問題で報告された問題は、カスタムインターセプターがエラー条件を適切に処理しなかったことが原因でした(プロミスは拒否されませんでした)。 それでも問題が発生する場合は、おそらく同じ状況です。バグのあるカスタムインターセプターがないことを確認してください。 それでもAngularJS側で何かが正しくないと思われる場合は、_最小限のライブ_再現シナリオを提供してください(理想的にはhttp://plnkr.co/を使用しますが、他の同様のツールでもかまいません)。

@ pkozlowski-オープンソースありがとう、私は確かにそれが私の問題であったことを確認できます(d'oh)。

これに関するメモがAngularのドキュメントにあるはずです-インターセプターを実装する$ httppromiseの動作を完全にオーバーライドしているとは思いもしませんでした。

私もこの問題に遭遇し、インターセプターを持っていました。それは確かに正しいリターンを持っていたので、何度も何度も見ました。 私はついに犯人を見つけました。 成功/エラーへの複数の呼び出しを使用している場合、または実際にそれらが正しいものを返すことを確認する必要がある場合:)成功コールバックは変更された応答を返す必要がありますが、エラーコールバックはインターセプターと同じように$ q.rejectで拒否を返す必要があります。

+1ありがとうみんな。 $ http.interceptorのグローバルカスタマイズでも同じ問題が発生しました

@chmanieの答えは+1。 どうもありがとうございます! 問題を修正しました。

+1ありがとう@chmanie! 私の問題も修正しました

+1ありがとう、拒否して修正しました!

+1。私の問題を修正してくれてありがとう。

+1ありがとう、拒否して修正しました!

@chmanieのソリューションは私のために働きます。

@chmanieソリューションは問題を修正しました。 Angularjsのドキュメントにこれに関するメモがあるはずです。

@chmanieありがとうございます〜

このページは役に立ちましたか?
0 / 5 - 0 評価