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 из-за ограниченного ключевого слова?
Спасибо
Ответы
Ответ 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.