服务器
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 :(得分:2)
$.get
不是重载的jQuery函数;为方便起见,它只返回the asynchronous request object,尽管该对象存在,但其响应尚未填充。您仍然需要使用回调来使用结果:
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
});
});
答案 1 :(得分:2)
第一个返回一个延迟对象。
function csv_data() {
return $.get('/csv_data');
}
csv_data().done(function(my_data) {
console.log(my_data);
});
管理回调的另一种方式。
所以无论如何,都可以通过回调访问数据。只是在第一个例子中,你可以通过返回的对象分配它,在第二个例子中,它被指定为$.get()
的参数。
答案 2 :(得分:0)
来自docs:
从jQuery 1.5开始,所有jQuery的Ajax方法都返回了一个超集 XMLHTTPRequest对象。这个jQuery XHR对象,或“jqXHR”, $ .get()返回实现Promise接口,全部提供 Promise的属性,方法和行为(请参阅Deferred 对象以获取更多信息)。
因此,此代码中的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?
});
}
答案 3 :(得分:0)
因为默认情况下请求是异步的。在第一种情况下,您希望在请求开始后立即使用结果。 在第二个中,您定义一个仅在请求完成后调用的回调。