[英]Javascript promise .catch not working
編輯:請參閱下面的答案
我有一個功能:
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並未觸發。
有什么想法嗎? 這是它正在調用的東西:
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);});
確保您在捕獲區域中返回了被拒絕的承諾。 所以這:
$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作為拒絕諾言的簡寫,所以我認為這是正確的答案:)。 您還可以將return $q.when(response)
用作推遲,解決之類的縮寫。
我建議閱讀: $ q.defer:您做錯了
確實,我會重新組織您的代碼,以遵循關於Promise的一些最佳實踐,尤其是在角度方面。 最好返回$ http請求本身(這是一個承諾):
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)–拒絕具有原因的派生承諾。 這等效於通過$ q.reject構建的拒絕來解決它
您需要執行此操作的原因是,如果您沒有發現錯誤並拒絕較低級別的承諾,則在線上的承諾鏈不會知道承諾被拒絕並將其視為成功。
試試這個代替
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");
}, function (err) {
console.log(err);
alert(err);
});
請記住, then
接受2個參數-一個函數(如果成功),一個函數(如果發生錯誤)。 您只提供了成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.