Сервер:
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
, и почему эти два метода возвращают разные объекты?
$.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
});
});
Сначала возвращается отложенный объект.
function csv_data() {
return $.get('/csv_data');
}
csv_data().done(function(my_data) {
console.log(my_data);
});
Просто другой способ управления обратным вызовом.
Таким образом, независимо от того, к каким данным обращаются через обратный вызов. Только в первом примере вы можете назначить его через возвращаемый объект, а во втором - в качестве аргумента $.get()
.
Из документов:
Начиная с 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?
});
}
Поскольку запросы по умолчанию асинхронны. В первом случае вы хотите использовать результат сразу после начала запроса. Во втором вы определяете обратный вызов, который вызывается только после завершения запроса.