JQuery $.ajax done callback not firing

У меня есть следующий код:

$("#loginSubmitButton").on("click",function(){
  var loginUserDetails = {
    email: $("#email").val(),
    password: $("#password").val()
  };

  //Send the AJAX request to authenticate the user
  $.ajax({
    type: "POST",
    url: "/somewebservice/v1/users/authenticate",
    data: JSON.stringify(loginUserDetails),
    contentType: "application/json;charset=UTF-8",
    dataType: "json",
  }).done(function() {
      $("#loginResult").text("Login successful");
    })
    .fail(function() {
      $("#loginResult").text("Login failed");
    });

});

В соответствии с документацией jquery (если я не понимаю что-то неправильно), я ожидаю, что это будет сделано, если я получу 200 OK с моего веб-сервера. Однако в хром-консоли я вижу ответ 200 OK, но jquery, похоже, запускает обработчик ошибок.

Кто-нибудь знает, что я могу делать неправильно?

Ответ 1

Вам нужно удалить:

dataType: "json"

Ответ 2

Есть много предложений по удалению

dataType: "json"

Пока я предоставляю, что это работает, возможно, он игнорирует основную проблему. Это скорее всего вызвано ошибкой парсера (браузер анализирует ответ json). Сначала проверьте параметр XHR как .always() или .fail().

Предполагая, что это синтаксический анализатор, тогда почему? Возможно, возвращаемая строка не JSON. Или это может быть ошибочное пробелы в начале ответа. Подумайте о том, чтобы взглянуть на него в скрипаче. Мой выглядел так:

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":".\/output\/ou...

В моем случае это была проблема с PHP, извергающим нежелательные символы (в этом случае спецификации UTF файла). Как только я удалил их, он устранил проблему, сохранив при этом

dataType: json

Ответ 3

Если ваш сервер возвращает пустую строку для ответа json (даже если с использованием 200 OK), jQuery рассматривает его как недействительный. Поскольку v1.9, пустая строка считается недопустимой json.

Какова бы ни была причина, хорошим местом для просмотра является параметр "данных", переданный обратным вызовам:

$.ajax( .. ).always(function(data) {
    console.log(JSON.stringify(data));
});

Его содержимое даст вам представление о том, что неправильно.

Ответ 4

Необходимо удалить из dataType: "json",

 dataType: "json"

Ответ 5

Несколько вещей, которые должны прояснить вашу проблему и пару советов в целом.

  • Не слушайте клик по кнопке отправки. Вы должны подождать, пока событие будет отправлено в форму.

  • Параметр data для $.ajax не ожидает строки JSON. Он хочет сериализованную строку или массив с именами и объектами значений. Вы можете легко создать любой из них с помощью .serialize() или .serializeArray().

Вот что я думал о вашем script.

$('#form-with-loginSubmitButton').on('submit', function(e){


  e.preventDefault():

  var $form = $(this),
      data = $form.serializeArray();

  $.ajax({
    type: "POST",
    url: "/somewebservice/v1/users/authenticate",
    data: data
  }).done(function(result){
    console.log(result);
  });

});

Ответ 6

URL-адрес ajax должен быть одним и тем же доменом. Вы не можете использовать AJAX для доступа к междоменным скриптам. Это из-за той же политики происхождения.
добавьте "dataType: JSONP" для достижения междоменной связи

используйте ниже код

 $.ajax({
       URL: cross domain 

        dataType: 'jsonp'  
            // must use dataType:JSONP to achieve cross domain communication, otherwise done function would not called. 
           // jquery ajax will return "statustext error" at }).always(function(data){}


 }).always(function(data){
      alert(JSON.stringify(data));
   }