我在尝试捕获承诺拒绝时遇到了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吗?
由于
答案 0 :(得分:49)
您需要使用括号表示法:
promise.then(function(response) {
// success
})
["catch"](function(response) {
// error
});
这是因为IE8实现了ECMAScript 3,它不允许以点表示法表示裸关键字。现代浏览器实现了允许它的ECMAScript 5.
许多库将.catch
与另一个关键字别名。但是,构建Angular承诺的方式扩展$q
承诺并不简单。所以["catch"]
必须这样做。请注意,finally
也是如此。
答案 1 :(得分:9)
是的,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的简写。
答案 2 :(得分:3)
http://docs.angularjs.org/api/ng/service/$q#the-promise-api
因为最终是JavaScript中的保留字并且ES3不支持保留关键字作为属性名称,所以您需要调用promise'finally'等方法来使您的代码IE8和Android 2.x兼容。
同样的捕获。