方案如下:
在这个场景中,我想创建一个返回promise的函数,我可以从客户端使用这个函数:
initData()
.done(function(myArray) {
processData(myArray);
})
.fail(function(response) {
console.log("An error occured: " + response.errorMessage);
});
客户端不应该关心initData()是否调用服务器,它应该为ajax调用失败或服务器特定错误调用fail()。
为此我需要两件事:
以下是我所拥有的:
function initData() {
var promise = $.getJSON(url);
return promise.then(function(response) {
if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') {
// Do something to trigger fail() in the client caller.
}
return response;
}, function(resp) {
// This satisfies point 1 above.
return { errorMessage: "Server error." };
});
}
我如何满足第二项要求?我使用的是jquery 3.1.1。
感谢。
答案 0 :(得分:1)
从您的then
回调中抛出错误。来电者会#34;赶上"它在失败的回调中(虽然我建议您学习使用标准then
和catch
并停止使用特定于jquery的done
和fail
)。
function initData() {
var promise = $.getJSON(url);
return promise.then(function(response) {
if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') {
throw new Error("uh oh!");
}
return response;
}, function(resp) {
// This satisfies point 1 above.
throw new Error("server error");
});
}
答案 1 :(得分:1)
要使承诺失败,只需throw
结果而不是return
:
function initData() {
return $.getJSON(url)e.then(function(response) {
if (typeof response !== 'undefined' && response !== null && typeof response.errorMessage !== 'undefined') {
throw { errorMessage: "Response error." };
}
return response;
}, function(resp) {
throw { errorMessage: "Server error." };
});
}
(这仅适用于jQuery 3.对于早期版本,请参阅Throwing an Error in jQuery's Deferred object)