web-dev-qa-db-ja.com

Angular $ q .catch()メソッドがIE8で失敗する

約束の拒否(基本的なngResource呼び出しによって返される約束)をキャッチしようとしているときに、IE8で奇妙なバグが発生しています:

このコードは.then(success, fail)構文で動作します:

_promise.then(function(response) {
  // success
},
function(response) {
  // error
});
_

しかし、これは.then(success).catch(fail)構文で失敗します:

_promise.then(function(response) {
  // success
})
.catch(function(response) {
  // error
});
_

.catch()行を指すIEエラーは次のとおりです:

期待される識別子

私は何か間違ったことをしていますか?誰かがそれを再現しますか?それとも、キーワードが制限されているため、一般的なIE8ですか?

ありがとう

30
Cétia

角かっこ表記を使用する必要があります。

promise.then(function(response) {
  // success
})
["catch"](function(response) {
  // error
});

これは、IE8がドット表記で裸のキーワードを許可しないECMAScript3を実装しているためです。最新のブラウザは、それを可能にするECMAScript5を実装しています。

多くのライブラリは、.catchを別のキーワードでエイリアスしています。ただし、Angular promiseの作成方法は、$q promiseを拡張するのは簡単ではありません。したがって、["catch"]を実行する必要があります。これはfinally

49

はい、IE8はそれがキーワードだと考えています。これはいくつかの方法で回避できます。

  1. promise.then(function() { })['catch'](function() { });
  2. promise.then(function() { /* success handler */ })).then(null, function() { /* error handler */ });
  3. または、成功とエラーを1つのthenステートメントに結合します(そのようなことが適切な場合):promise.then(function() { /* success handler here */ }, function() { /* error handler here */ });

catch は#2の省略形です。

9
HackedByChinese

http://docs.angularjs.org/api/ng/service/$q#the-promise-api

最終的にはJavaScriptの予約語であり、予約キーワードはES3ではプロパティ名としてサポートされていないため、コードをIE8およびAndroid 2 .x互換。

キャッチについても同じです。

3
Miraage