Подтвердить что ты не робот

Как вызвать обратный вызов jquery.ajax() на основе ответа сервера, а не HTTP 500?

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

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

4b9b3361

Ответ 1

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

  • 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
});

Ответ 2

Предположим, что сервер отправляет 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

Обратный вызов ошибки заключается в том, что AJAX в оба конца не может быть успешно завершен, а не на основе вашей логики сервера. Вы несете ответственность за проверку того, что вы считаете успешным ответом внутри обратного вызова успеха. т.е. добавьте одно условие IF, которое проверяет, было ли сообщение = "произошла ошибка". и включить туда свою логику ошибок, иначе логика успеха.

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

Ответ 4

Проще всего было бы сделать так, чтобы реструктурировать:

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

Ответ 5

Один простой способ сделать это - просто использовать функцию 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;
    }
}