jQuery延迟对象与嵌套的ajax调用

我的情况是我的ajax调用必须按特定顺序执行。 我在其他情况下使用过jQuery Deferred对象,但似乎无法找到使这种行为适当的方法。

我有一个函数,它在它的生命周期中执行许多ajax请求。 某些请求将在成功回调其他请求期间执行。

我的问题: 有没有办法将所有嵌套的延迟对象返回到原来的$.when调用?

一个简化的例子是:

 function nestedAjax() { $.get("/", function(){ console.log("First ajax done."); $.get("/", function(){ console.log("Second ajax done."); }); }); }; 

我想让nestedAjax函数使用$.when() nestedAjax $.when()$.done()如下所示:

 $.when(nestedAjax()).done(function(){ console.log("Complete"); });​ 

控制台输出读数:

 > First ajax done. > Second ajax done. > Complete. 

我可以返回第一个实现此目的:

 > First ajax done. > Complete. > Second ajax done. 

但显然这不是我要求的。 任何帮助,将不胜感激。

它实际上非常简单。 虽然所有AJAX调用都是Deferred对象,但我仍然使用一个方法本身。

 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(); }; 

您实际上并不需要额外的延迟对象。 您可以通过使用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); }); 

由于某些原因,无法在上述答案中添加评论。

所以我在这里添加我的评论。 上述答案仅在ajax调用快并且在返回dfd.promise()之前返回时才有效。

我也有同样的问题。 正如你所看到的那样。 返回的延迟对象声明它处于 “待定”状态: http : //jsfiddle.net/BtEKa/