编辑:查看下面的答案
我有一个函数:
dataFactory.getCurrentStepId(wf.identifier, ctx.identifier)
.then(function (data) {
console.log('then');
$timeout(function () {
$("#app-node-" + data.identifier)
.parent().parent().css("border", "5px solid green");
});
})
.catch(function () {
console.log('error');
alert('Error!')
});
getCurrentStepId
有一个异常,我看到控制台上打印了它发送的 AJAX 请求的错误,但我的警报和 console.log 没有在 catch 中触发。
有什么想法吗?这是它调用的内容:
app.factory('dataFactory', function ($http, $q) {
var _baseUrl = webServiceContext;
var _doGet = function (endpoint) {
var deferred = $q.defer();
$http.get(_baseUrl + '/' + endpoint).then(function (response) {
deferred.resolve(response.data);
});
return deferred.promise;
};
var getCurrentStepId = function (wid, cid) {
return _doGet('wf/step/' + wid + '/' + cid);
};
})
答案在这里
@Blunderfest 几乎做对了:
$http.get(_baseUrl + '/' + endpoint).then(function (response) {
deferred.resolve(response.data);
}).catch(function(e){return deferred.reject(e);});
最佳答案
确保在 catch block 中返回被拒绝的 promise 。所以这个:
$http.get(_baseUrl + '/' + endpoint).then(function (response) {
deferred.resolve(response.data);
})
应该是这样的:
$http.get(_baseUrl + '/' + endpoint).then(function (response) {
deferred.resolve(response.data);
}).catch(function(e){
return $q.reject(e);
});
实际上,您可以使用 $q.reject 作为拒绝 promise 的简写,所以我认为这是一个正确的答案:)。您还可以使用 return $q.when(response)
作为 deferred、resolve 等的简写。
我推荐阅读:$q.defer: You're doing it wrong
真的,我会重新组织您的代码以遵循一些关于 promise 的最佳实践,尤其是在 Angular 方面。最好返回 $http 请求本身(这是一个 promise ):
app.factory('dataFactory', function ($http, $q) {
var _baseUrl = webServiceContext;
var _doGet = function (endpoint) {
// Returns the promise wholesale.
return $http.get(_baseUrl + '/' + endpoint).then(function (response) {
return response.data;
}).catch(function(e){
// ensures the returned promise is rejected up the chain.
return $q.reject(e);
});
};
var getCurrentStepId = function (wid, cid) {
return _doGet('wf/step/' + wid + '/' + cid);
};
})
reject(reason) – rejects the derived promise with the reason. This is equivalent to resolving it with a rejection constructed via $q.reject
您需要这样做的原因是,如果您不捕获错误并拒绝较低级别的 promise ,则 promise 链上游将不知道 promise 被拒绝并将其视为成功。
关于Javascript promise .catch 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35091054/