30

我在 IE8 上遇到了一个奇怪的错误,同时试图捕获一个 promise 拒绝(基本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?

谢谢

4

3 回答 3

50

您需要使用括号表示法:

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

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

很多库都.catch使用另一个关键字来别名。然而,Angular Promise 的构建方式并不容易扩展$qPromise。所以["catch"]必须这样做。请注意,这也适用于finally.

于 2014-04-16T09:29:41.650 回答
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 的简写。

于 2014-04-16T09:29:52.847 回答
3

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

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

捕捉也一样。

于 2014-04-16T09:50:17.990 回答