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

时间:2014-04-16 09:20:40

标签: angularjs internet-explorer internet-explorer-8 promise angular-promise

我在尝试捕获承诺拒绝时遇到了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
});

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

  

预期标识符

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

由于

3 个答案:

答案 0 :(得分:49)

您需要使用括号表示法:

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

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

许多库将.catch与另一个关键字别名。但是,构建Angular承诺的方式扩展$q承诺并不简单。所以["catch"]必须这样做。请注意,finally也是如此。

答案 1 :(得分: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 */ });
  4. catch是#2的简写。

答案 2 :(得分:3)

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

因为最终是JavaScript中的保留字并且ES3不支持保留关键​​字作为属性名称,所以您需要调用promise'finally'等方法来使您的代码IE8和Android 2.x兼容。

同样的捕获。