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

Posted

技术标签:

【中文标题】Angular $q .catch() 方法在 IE8 中失败【英文标题】:Angular $q .catch() method fails in IE8 【发布时间】:2014-05-31 01:39:22 【问题描述】:

我在 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?

谢谢

【问题讨论】:

【参考方案1】:

你需要使用括号表示法:

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

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

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

【讨论】:

感谢您的解释。我会坚持使用then(null, error) 表示法,它看起来比这个丑陋的["catch"] 更好 @Bixi 或者,您可以使用带有 ESCODEGEN 的 ESPRIMA 之类的预处理器,它会在构建过程中自动将 .catch 替换为 ["catch"] 感谢您提供的信息,但这太过分了,而且不会增加太多复杂性【参考方案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 的简写。

【讨论】:

不过,您的两个替代方案做的事情完全不同。 第一个会捕获.then 中的错误,第二个不会。 我没有关注你。然后可以采用 1、2 或 3 个函数参数。第一个是成功,第二个是错误,第三个是通知。 catch 只是调用并返回.then(null, fn) 的结果。好吧,我的意思是在我的回答中(所以有三个选项),但我本能地将它优化为一个调用,同时使用成功和错误处理程序。 澄清区别:***.com/questions/24662289/… ...第三个选项不会像在第一个和第二个选项中那样捕获成功处理程序中抛出的异常。【参考方案3】:

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

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

catch 也是如此。

【讨论】:

以上是关于Angular $q .catch() 方法在 IE8 中失败的主要内容,如果未能解决你的问题,请参考以下文章

关于用 Angular 和 typescript 链接 $q 承诺的困惑

搜索 || BFS || POJ 3278 Catch That Cow

Typescript async/await 和 angular $q 服务

POJ - 3278 Catch That Cow

无法从另一个组件/ Angular 4中的auth.service访问错误消息

Angular2 中 Angular 的 $q 相当于啥?