在这种情况下,我的ajax调用必须以特定的顺序执行。我曾在其他情况下使用过jQuery延迟对象,但似乎找不到一种方法来使其具有适当的行为。
我有一个在其生命周期内执行大量ajax
请求的函数。部分请求会在其他请求成功回调时执行。
我的问题是:有没有办法将所有嵌套的延迟对象返回到原始的 $.when
调用?
一个简化的例子是:
function nestedAjax() {
$.get("/", function(){
console.log("First ajax done.");
$.get("/", function(){
console.log("Second ajax done.");
});
});
};
我尝试让nestedAjax
函数使用$.when()
和$.done()
,如下所示:
$.when(nestedAjax()).done(function(){
console.log("Complete");
});
控制台输出为:
> First ajax done.
> Second ajax done.
> Complete.
我可以返回第一个get
来实现此目的:
> First ajax done.
> Complete.
> Second ajax done.
但显然这不是我所需要的。任何帮助都将不胜感激。
发布于 2012-09-05 21:50:49
这实际上很简单。尽管所有的AJAX调用都是延迟对象,但我仍然对方法本身使用延迟对象。
function nestedAjax() {
var dfd = $.Deferred();
$.get("/echo/json/", function(){
console.log("First ajax done.");
$.get("/echo/json/", function(){
console.log("Second ajax done.");
dfd.resolve();
});
});
return dfd.promise();
};
发布于 2013-03-08 05:53:31
实际上,您不需要额外的延迟对象。您可以通过使用then()
链接来执行您想要的操作
function nestedAjax() {
return $.get("/echo/json/").then(function(result1){
console.log("First ajax done.");
if (result1) {
return result1;
} else {
return $.get("/echo/json/").then(function(nestedResult){
console.log("Second ajax done.");
return nestedResult;
});
}
});
};
我添加了一些逻辑,因为我认为这可能是您同步执行此操作的原因。之后,您可以在$.when
中使用结果,如下所示:
$.when(nestedAjax(), $.get("/something/else")).then(function(nested, other) {
console.log("Complete.", nested, other);
});
发布于 2012-09-13 17:23:07
由于某种原因,无法在上面的答案中添加评论。
因此,我在这里添加了我的评论。只有当ajax调用很快并且在返回dfd.promise()之前返回时,上述答案才有效。
我也有同样的问题。如你所见。返回的延迟对象声明它是“挂起的”:http://jsfiddle.net/BtEKa/
https://stackoverflow.com/questions/12273437
复制相似问题