Angularjs 在IE8中,$q.catch()方法失败

Angularjs 在IE8中,$q.catch()方法失败,angularjs,internet-explorer,internet-explorer-8,promise,angular-promise,Angularjs,Internet Explorer,Internet Explorer 8,Promise,Angular Promise,我在IE8上遇到了一个奇怪的错误,当时我正试图捕获拒绝承诺(通过基本ngResource调用返回的承诺): 此代码使用。然后(成功,失败)语法: promise.then(function(response) { // success }, function(response) { // error }); promise.then(function(response) { // success }) .catch(function(response) { // error }

我在IE8上遇到了一个奇怪的错误,当时我正试图捕获拒绝承诺(通过基本
ngResource
调用返回的承诺):

此代码使用
。然后(成功,失败)
语法:

promise.then(function(response) {
  // success
},
function(response) {
  // error
});
promise.then(function(response) {
  // success
})
.catch(function(response) {
  // error
});
但是这一次失败的原因是
。然后(成功)。捕获(失败)
语法:

promise.then(function(response) {
  // success
},
function(response) {
  // error
});
promise.then(function(response) {
  // success
})
.catch(function(response) {
  // error
});
指向
.catch()
行的IE错误是:

预期标识符

我做错什么了吗?有人复制它吗?或者它是一个常见的IE8,由于限制关键字


谢谢

您需要使用括号表示法:

promise.then(function(response) {
  // success
})
["catch"](function(response) {
  // error
});
这是因为IE8实现了ECMAScript 3,它不允许在点表示法中使用裸关键字。现代浏览器实现了允许它的ECMAScript 5


许多库使用另一个关键字别名
.catch
。然而,角度承诺的构建方式并不是简单地扩展
$q
承诺。因此,
[“catch”]
必须这样做。请注意,对于
来说也是如此。最后

是的,IE8认为它是一个关键字。您可以通过以下几种方式解决此问题:

  • promise.then(function(){})['catch'](function(){})
  • promise.then(function(){/*成功处理程序*/})).then(null,function(){/*错误处理程序*/})
  • 或者将成功和错误组合成一个
    then
    语句,如果这样的话:
    promise.then(function(){/*success-handler-here*/},function(){/*error-handler-here*/})
  • 是#2的缩写。

    因为finally在JavaScript中是一个保留字,并且ES3不支持保留关键字作为属性名,所以您需要调用类似promise'finally'的方法,以使代码IE8和Android 2.x兼容


    catch也是一样。

    不过,您的两个备选方案做的事情完全不同。第一个将捕获
    中的错误。然后
    ,第二个将不会。我不明白您的意思。然后可以接受1、2或3个函数参数。第一个是成功,第二个是错误,第三个是通知
    catch
    只调用并返回
    的结果。然后(null,fn)
    。好吧,我的意思是在我的回答中(所以有三个选项),但我本能地将其优化为一个调用,使用成功和错误处理程序。。。第三个选项没有像第一个和第二个选项那样捕获成功处理程序中抛出的异常。感谢您的解释。我将坚持使用
    then(null,error)
    符号,它看起来比这个丑陋的
    [“catch”]
    @Bixi更好。或者,您可以使用像ESPRIMA这样的预处理器和ESCODEGEN,在构建过程中自动将
    .catch
    替换为
    [“catch”]
    。感谢您提供的信息,但这是矫枉过正,增加了不多的复杂性