Подтвердить что ты не робот

Angular Метод $q.catch() не работает в IE8

Я испытываю странную ошибку в IE8, пытаясь уловить обещание отклонить (обещание, возвращенное базовым вызовом ngResource):

Этот код работает с синтаксисом .then(success, fail):

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

но это не с синтаксисом .then(success).catch(fail):

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

и ошибка IE, указывающая на строку .catch():

Ожидаемый идентификатор

Я что-то делаю неправильно? кто-то воспроизводит его? или это общий IE8 из-за ограниченного ключевого слова?

Спасибо

4b9b3361

Ответ 1

Вам нужно использовать обозначения скобок:

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

Это связано с тем, что IE8 реализует ECMAScript 3, который не разрешает использование голосовой информации в виде точечной нотации. Современные браузеры реализуют ECMAScript 5, который позволяет это.

Много псевдонимов библиотек .catch с другим ключевым словом. Однако способ Angular promises построен не просто для расширения $q promises. Так что ["catch"] должен был бы сделать. Обратите внимание, что это также верно для finally.

Ответ 2

Да, IE8 считает это ключевым словом. Вы можете обойти это несколькими способами:

  • promise.then(function() { })['catch'](function() { });
  • promise.then(function() { /* success handler */ })).then(null, function() { /* error handler */ });
  • Или объедините успех и ошибку в один оператор then, если такая вещь подходит: promise.then(function() { /* success handler here */ }, function() { /* error handler here */ });

catch является сокращением для # 2.

Ответ 3

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

Потому что, наконец, зарезервированное слово в JavaScript и зарезервированные ключевые слова не поддерживаются как имена свойств ES3, вам нужно будет вызвать метод, как обещание '', чтобы сделать ваш код совместимым с IE8 и Android 2.x.

То же самое для catch.