【发布时间】:2011-07-13 22:26:13
【问题描述】:
我正在尝试使用jQuery.when 触发两个ajax 请求,然后在两个请求完成后调用某个函数。这是我的代码:
var count = 0;
var dfr;
var showData = function(data) {
dfr.resolve();
alert(count);
// Do something with my data data received
};
var method1 = function() {
dfr = $.Deferred();
return $.ajax('localhost/MyDataService/DataMethod_ReturnsData', {
dataType: "jsonp",
jsonp: "$callback",
success: showData
});
};
var method2 = function() {
return $.ajax('localhost/MyDataService/DataMethod_ReturnsCount', {
dataType: "jsonp",
jsonp: "$callback",
success: function(data) {
count = data.d.__count;
}
});
};
$.when(method1(), method2())
.then(showData());
但是,这并没有按预期工作。 method1 中的 Ajax 调用将返回要在 showData() 中使用的数据,method2 中的 Ajax 调用将返回要分配给 var count 并稍后在 showData() 中使用的计数。
但是当我触发上述代码时,method1 被调用,然后被调用 method2,然后 showData 将 showData 中的数据保留为 'undefined'。我怎样才能通过$.when 实现这一点,据我所知,只有在执行返回$.promise 的两个函数时才会执行此操作。我希望两个 ajax 调用都应该并行调用,之后的结果会根据两个调用的结果显示。
【问题讨论】:
-
您根本不需要
dfr = $.Deferred(),因为$.ajax()返回的jqXhr是延迟的。不确定这是否会解决这里的问题,但这绝对是不必要的。问题可能是您使用的是.then()而不是.done()。 -
我指的是 eric hynds [erichynds.com/jquery/using-deferreds-in-jquery/] 的帖子,他也使用了 $.when 然后回调。
-
只有在使用不直接处理 deferred 的对象时才需要。 Eric 的演示使用了一个计时器对象,因此他必须在计时器到期时手动“解析”他自己创建的延迟对象。就像马特说的那样,如果它是一个 AJAX 查询,你就不需要它。
-
从方法中删除成功并使用 $.when(m1(),m2()).then(m3) 和 m3 = function(data1, data2)
-
@Guillaume86 :我尝试使用 m3 = function(data1, data2) 实现您的删除成功的建议,但是 data1 和 data2 的值都未定义。你可以在这里修改我的代码 [jsfiddle.net/f4hmL/3/] 以显示它是如何工作的..?
标签: jquery ajax jquery-deferred