JQuery: в чем разница между этими двумя методами $ .get ()?

0

Сервер:

def csv_data(request): #mapped to url /csv_data
    with open('my_static_data.csv', 'r') as csv:
        response = HttpResponse(csv.read(), content_type="text/csv")
        response['Content-Disposition'] = 'attachment; filename="data.csv"'
    return response #returns the csv file

Клиент:

1.

function csv_data() {
  var response = $.get('/csv_data');
  return response;
}

$(function () {
  var my_data = csv_data();
  console.log(my_data); //returns a response object
  console.log(my_data.responseText); //undefined?!
}

2.

$(function () {
  $.get('/csv_data', function(d) {
    console.log(d); // returns csv_data. Why not the same response object?
  });
}

Данные, возвращаемые методом № 2, - это то, что я намеревался использовать. Почему my_data.responseText не undefined, и почему эти два метода возвращают разные объекты?

  • 0
    Я думаю, что это связано со временем, которое требуется для извлечения данных из запроса get, но я бы хотел, чтобы кто-то объяснил, что именно здесь происходит.
Теги:
get

4 ответа

2
Лучший ответ

$.get не является перегруженной функцией jQuery; он просто возвращает асинхронный объект запроса для удобства, и хотя этот объект существует, его ответ еще не заполнен. Вам все равно нужно использовать обратный вызов для использования результата:

function csv_data(callback) {
  $.get('/csv_data', callback);
}

$(function () {
  csv_data(function(my_data) {
    console.log(my_data); // returns a response object
    console.log(my_data.responseText); // not undefined
  });
});
2

Сначала возвращается отложенный объект.

function csv_data() {
   return $.get('/csv_data');
}

csv_data().done(function(my_data) {
    console.log(my_data);
});

Просто другой способ управления обратным вызовом.

Таким образом, независимо от того, к каким данным обращаются через обратный вызов. Только в первом примере вы можете назначить его через возвращаемый объект, а во втором - в качестве аргумента $.get().

0

Из документов:

Начиная с jQuery 1.5, все методы jQuery Ajax возвращают надмножество объекта XMLHTTPRequest. Этот объект jQuery XHR или "jqXHR", возвращаемый $.get(), реализует интерфейс Promise, предоставляя ему все свойства, методы и поведение Promise (см. Раздел "Отложенный объект" для получения дополнительной информации).

Таким образом, response в этом коде не является фактическими данными из запроса AJAX:

var response = $.get('/csv_data');

Принимая во внимание, что здесь d - это ответ данных из запроса AJAX:

$(function () {
  $.get('/csv_data', function(d) {
    console.log(d); // returns csv_data. Why not the same response object?
  });
}
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню