Угловой $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 из-за служебное слово ?

спасибо

3 ответов


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

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

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

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


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

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

catch сокращенно от #2.


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

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

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