Как вызвать функцию обратного вызова ошибки jquery.ajax () на основе ответа сервера, а не HTTP 500? - PullRequest
40 голосов
/ 07 июня 2011

Используя функцию 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

 }

});

У меня есть два вопроса на основе приведенного выше кода:

  1. Когда будетjquery.ajax () error callback вызывается ??

  2. Что если сервер ответит мне объектом json со строковым сообщением " Произошла ошибка ".Это означает, что запрос все еще успешно отправлен, но я получил ответ сервера {message: "There is an error"}.

Я думаю, что независимо от того, какой сервер строковых значений отвечает, если клиент получит ответ сервера, обратный вызов jquery.ajax () success будет запущен в любом случае.

Я хотел бы спросить, если сервер специально возвращает мне объект JSON со строковым значением, таким как {message: 'There is an error'}, может ли сервер что-то сделать, чтобы этот ответ мог быть обработан в jquery.ajax () error обратный вызов вместо success обратный вызов?

Ответы [ 6 ]

31 голосов
/ 07 июня 2011

Ошибка обратного вызова будет выполнена, когда ответ от сервера не будет тем, что вы ожидали.Так, например, в таких ситуациях это:

  • HTTP 404/500 или любое другое сообщение об ошибке HTTP было получено
  • были получены данные неправильного типа (т.е. вы ожидали JSON, выполучил что-то еще).

В вашей ситуации данные верны (это сообщение 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
});
26 голосов
/ 07 августа 2013

Мы предполагаем, что сервер отправляет JSON, и в случае успешного запроса мы получим что-то вроде этого:

{
    success: true,
    data: {
        name: 'Foo'
    }
}

... и при ошибке:

{
    success: false,
    error: 'Something bad happened.'
}

Затем мы просто фильтруем ответ с помощью $. Отложено :

$.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.
})
3 голосов
/ 07 июня 2011

Ошибка обратного вызова для случая, когда обход Ajax не может быть успешно завершен, а не для чего-то, основанного на логике вашего сервера. Это будет ваша ответственность, чтобы проверить, что вы считаете успешным ответом в обратном вызове успеха. Т.е. добавить единственное условие IF, которое проверяет, если сообщение = «Произошла ошибка». и включите туда свою логику ошибок, иначе сделайте логику успеха.

Подход к выполнению того, о чем вы просите, состоит в том, чтобы сервер возвращал заголовок 404 при возникновении ошибки, тогда он будет обработан обратным вызовом ошибки. Проблема с этим подходом заключается в том, что вы будете скрываться, если есть реальные ошибки, и вы не сможете передавать с ним дополнительные данные.

2 голосов
/ 07 июня 2011

Самое простое, что можно сделать, это реструктурировать так:

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
});
0 голосов
/ 17 марта 2019

Этот оригинальный вопрос был опубликован несколько лет назад, и, возможно, сейчас есть лучшие способы справиться с этим. Вот предложение по обработке нескольких типов ошибок , включая вопрос ОП.

Пример типа ввода (ошибка) # 1

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']();

Тип ввода (успех: ошибка), пример # 2

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");

Пример типа ввода (успех) # 3

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" (или что вы захотите), чтобы вызвать ошибку; позволяет делать разные вещи в зависимости от ошибки.

0 голосов
/ 29 апреля 2014

Один из простых способов сделать это - просто использовать функцию 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...