通过使用jquery ajax函数,我可以执行以下操作:
$.ajax({
url: url,
type: 'GET',
async: true,
dataType: 'json',
data: data,
success: function(data) {
//Handle server response here
},
error: function(xhr, status, error){
//Handle failure here
}
});
根据以上代码,我有两个问题要问:
何时调用jquery.ajax()error
回调??
如果服务器使用字符串消息“出现错误”向我回复了json对象,该怎么办?这意味着请求仍然成功发送,但我得到了服务器响应{message: "There is an error"}
。
我认为无论服务器响应的是什么字符串值,如果客户端得到服务器的响应,无论如何都会触发 jquery.ajax() success
回调。
我想询问服务器是否专门向我返回一个字符串值为{message: 'There is an error'}
的JSON对象,服务器可以做一些事情,以便可以在 jquery.ajax()中处理此响应 error
回调而不是success
回调?
答案 0 :(得分:30)
当服务器的响应不符合您的预期时,将执行错误回调。例如,在这种情况下:
在您的情况下,数据是正确的(这是一条JSON消息)。如果要根据接收数据的值手动触发错误回调,则可以非常简单地完成。只需将错误的匿名回调更改为命名函数。
function handleError(xhr, status, error){
//Handle failure here
}
$.ajax({
url: url,
type: 'GET',
async: true,
dataType: 'json',
data: data,
success: function(data) {
if (whatever) {
handleError(xhr, status, ''); // manually trigger callback
}
//Handle server response here
},
error: handleError
});
答案 1 :(得分:25)
我们假设服务器正在发送JSON,如果请求成功,我们将得到类似的内容:
{
success: true,
data: {
name: 'Foo'
}
}
......并且失败了:
{
success: false,
error: 'Something bad happened.'
}
然后我们只需使用$.Deferred
过滤回复$.get('http://localhost/api').then(function(res) {
var filter = $.Deferred();
if (res.success) {
filter.resolve(res.data);
} else {
filter.reject(res.error);
}
return filter.promise();
}).done(function(data) {
console.log('Name:', data.name); // Outputs: Foo
}).fail(function(error) {
console.log('Error:', error); // Outputs: Something bad happened.
})
答案 2 :(得分:3)
错误回调是指无法成功完成Ajax往返时,而不是基于服务器逻辑的错误。您有责任在成功回调中检查您认为成功响应的内容。即添加一个IF条件,检查消息是否为“出错”。并在那里包含您的错误逻辑,否则执行成功逻辑。
执行您要求的方法是让服务器在出现错误时返回404标头,然后由错误回调处理。这种方法的问题在于,如果存在实际错误,您将隐藏,并且您将无法使用它传递其他数据。
答案 3 :(得分:2)
最简单的事情就是如此重组:
function handleAjaxError function(xhr, status, error) {
//Handle failure here
}
$.ajax({
url: url,
type: 'GET',
async: true,
dataType: 'json',
data: data,
success: function(data) {
//Handle server response here
if (data.message == 'There is an error')
{
handleAjaxError();
return;
}
//... all is good....
},
error: handleAjaxError
});
答案 4 :(得分:0)
一种简单的方法是只使用jQuery always()函数进行回调,然后如果要手动创建错误,只需利用Duck Typing!
例如:
$.get(url, {"data": data}).always(function(result)
{
if (typeof result.status !== "undefined" && result.status !== 200) // Status code 200 represents Success/OK
{
//handle error
error = "Your error was " + result.status + " " + result.statusText;
}
else
{
//success
}
});
如果出现自然标头错误,例如404 Not Found,则始终会运行错误部分。如果要手动返回错误,可以模拟通常传递错误的XHR对象(例如在PHP中):
public function ServerSideAjaxResponse($data)
{
if (!$data)
{
$response["status"] = 1001; //Make up your own error codes! Yippee! Fun!
$response["statusText"] = "Error! You forgot to send the data!";
echo json_encode($return);
return;
}
}
答案 5 :(得分:0)
这个原始问题发布于多年前,也许现在有更好的方法来解决这个问题。这是处理多种类型的错误(包括操作员的问题)的建议。
function handleError (type){
type = type || "Connection Issue";
var value = "Error occurred: " + type;
alert(value);
}
function checkIfError(response){
if (response == "DB_ERROR") {
handleError("Server error");
throw new Error("JS died"); // optional, keep from running additional script
}
}
var example = {
success: function (response) {
checkIfError(response); // check data if error msg
// do stuff when proper data sent
alert(response);
}, error: handleError // connection error, call error msg
};
test1 = example['error']();
function handleError (type){
type = type || "Connection Issue";
var value = "Error occurred: " + type;
alert(value);
}
function checkIfError(response){
if (response == "DB_ERROR") {
handleError("Server error");
throw new Error("JS died"); // optional, keep from running additional script
}
}
var example = {
success: function (response) {
checkIfError(response); // check data if error msg
// do stuff when proper data sent
alert(response);
}, error: handleError // connection error, call error msg
};
test2 = example['success']("DB_ERROR");
function handleError (type){
type = type || "Connection Issue";
var value = "Error occurred: " + type;
alert(value);
}
function checkIfError(response){
if (response == "DB_ERROR") {
handleError("Server error");
throw new Error("JS died"); // optional, keep from running additional script
}
}
var example = {
success: function (response) {
checkIfError(response); // check data if error msg
// do stuff when proper data sent
alert(response);
}, error: handleError // connection error, call error msg
};
test3 = example['success']("Proper Response");
通过使用函数,如果脚本中有多个调用,则可以简化更改。
让您的PHP(或任何服务器端代码)返回“ DB_ERROR” (或您想要的任何内容)的响应以触发错误;允许您根据错误做不同的事情。