我在这我的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.
但显然这不是我需要。 任何帮助,将不胜感激。
这其实很简单。 虽然所有的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();
};
你实际上并不需要一个额外的延迟对象。 你可以做你想做的与链接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);
});
Couldn't添加评论因故上面的回答。
所以我在这里添加我的意见。 如果Ajax调用快速返回之前返回dfd.promise()以上的答案才有效。
我也有同样的问题。 正如你所看到的。 返回的延迟对象状态,它是“待定”: http://jsfiddle.net/BtEKa/