JQuery:这两个$ .get()方法有什么区别?

时间:2013-11-28 04:47:57

标签: javascript jquery get

服务器

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,为什么这两个方法会返回不同的对象?

4 个答案:

答案 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)

因为默认情况下请求是异步的。在第一种情况下,您希望在请求开始后立即使用结果。 在第二个中,您定义一个仅在请求完成后调用的回调。