IE8中的Angular $ q .catch()方法失败

Cét*_*tia 30 internet-explorer internet-explorer-8 promise angularjs angular-promise

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

此代码使用.then(success, fail)语法:

promise.then(function(response) {
  // success
},
function(response) {
  // error
});
Run Code Online (Sandbox Code Playgroud)

但这个失败的.then(success).catch(fail)语法:

promise.then(function(response) {
  // success
})
.catch(function(response) {
  // error
});
Run Code Online (Sandbox Code Playgroud)

并且指向该.catch()行的IE错误是:

预期的标识符

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

谢谢

Ben*_*aum 49

您需要使用括号表示法:

promise.then(function(response) {
  // success
})
["catch"](function(response) {
  // error
});
Run Code Online (Sandbox Code Playgroud)

这是因为IE8实现了ECMAScript 3,它不允许以点表示法表示裸关键字.现代浏览器实现允许它的ECMAScript 5.

很多库.catch使用另一个关键字别名.然而,建立Angular承诺的方式扩展$q承诺并不简单.所以["catch"]必须这样做.请注意,这也是如此finally.


Hac*_*ese 9

是的,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的简写.

  • 我没跟着你.然后可以采用1,2或3个函数参数.第一个是成功,第二个是错误,第三个是通知.`catch`只是调用并返回`.then(null,fn)`的结果.好吧,我的意思是在我的答案中(所以有三个选项),但我本能地将它优化为一个调用,包括成功和错误处理程序. (4认同)