Возврат данных из ajax приводит к странному объекту

Я знаю, что этот вопрос можно было спросить тысячу раз, но я не могу найти ответ. Я хочу result быть данными, возвращаемыми из ajax-запроса, который должен быть массивом json-data (результат console.log(data)).

  var result = $.ajax({
    type: 'GET',
    url: dataPath,
    dataType: 'json',
    success: function(data) {
      console.log(data)
      },
    error: function(){
      //alert("damn");  
      },
    data: {},
    aync: false
  });

  console.log(result); 

Однако console.log(result); вернет какой-то странный объект, который я не знаю, как обращаться. Почему не result= data?

Ответ 1

опечатка.

Измените это:

aync: false

в

async: false

И метод ajax все еще возвращает объект jqXHR, выполняющий запрос, а не результат. Используйте параметр data в вызове success и храните его где-нибудь.

Ответ 2

Прежде всего удалите aync: false из своего кода. Он должен быть записан async: false, но вам не нужно его для достижения своей цели, а то, что он на самом деле делает, блокирует весь пользовательский интерфейс браузера, что приводит к ужасному пользователю. Помните, что "A" в AJAX означает Асинхронный.

Результат вызова $.ajax() - это prom, который не совпадает с вашими данными, но он может быть полезен для доступа к вашим данным. Вам просто нужно использовать его определенным образом.

Попробуйте изменить:

 console.log(result);

в

result.done(function (data) { 
    console.log(data);
});

или

result.done(function (data) { 
    console.dir(data);
});

или даже это может работать - непроверено:

result.done(console.dir);

Подробнее см. этот ответ.

Ответ 3

Инициализировать result внутри success.

 var result;
  $.ajax({
        type: 'GET',
        url: dataPath,
        dataType: 'json',
        success: function(data) {
          result = data;
          console.log(data)
          },
        error: function(){
          //alert("damn");  
          },
        data: {},
        async: false
      });

      console.log(result);

Ответ 4

Вы упомянули, что console.log(result) возвращает странный объект, на самом деле этот странный объект известен как объект xhr (XMLHttpRequest).

Поскольку вызов syncronous из-за async: false, поэтому легко получить returned data как

var result = $.ajax({...}); // get the xhr object in to result
console.log(result.responseText); // xhr object has a "responseText" property

Так как result.responseText будет доступен только после завершения запроса, и нет возможности выполнить этот console.log(result.responseText); из-за async:false, прежде чем request завершится, потому что запрос syncronous ajax зависает во всех он завершает запрос.

В вашем success обратном вызове data будет объект из-за dataType: 'json', но вне обратного вызова success, то есть console.log(result.responseText); будет только текстом, чтобы использовать его как объект, который вы должны преобразовать в объект с использованием $.parseJSON(result.responseText).

Ответ 5

Существует небольшая орфографическая ошибка aync: false должен читать async: false, предполагая, конечно, что вам требуется, чтобы запрос выполнялся синхронно, т.е. для остальной части вашего кода ждать этого результата.

Я думаю, что основная проблема здесь в том, что результат, который вы пытаетесь вывести на консоль, не ссылается на запрос ajax.

Это ваш выбор, как вы ссылаетесь на данные, возвращаемые с помощью запроса ajax, вы выбрали данные слова, которые так же легко могли быть результатом или json_Data или return_Data или....

Следовательно, чтобы отправить результат запроса ajax на консоль, я бы предложил:

var result = $.ajax({
    type: 'GET',
    url: dataPath,
    dataType: 'json',
    success: function(result) {
      console.log(result)
      },
    error: function(){
      //alert("damn");  
      },
    data: {},
    async: false
  });