Javascript 带有嵌套ajax调用的jQuery延迟对象

Javascript 带有嵌套ajax调用的jQuery延迟对象,javascript,jquery,jquery-deferred,promise,Javascript,Jquery,Jquery Deferred,Promise,我的ajax调用必须按特定顺序执行。我在其他情况下使用了jQuery延迟对象,但似乎找不到一种方法使其正常工作 我有一个函数,在它的生命周期中执行许多ajax请求。一些请求将在其他请求的成功回调期间执行 我的问题:是否有方法将所有嵌套的延迟对象返回到原始的$。何时调用? 一个简化的例子是: function nestedAjax() { $.get("/", function(){ console.log("First ajax done."); $.ge

我的ajax调用必须按特定顺序执行。我在其他情况下使用了jQuery延迟对象,但似乎找不到一种方法使其正常工作

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

我的问题:是否有方法将所有嵌套的延迟对象返回到原始的
$。何时调用?

一个简化的例子是:

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");
});​
$.when(nestedAjax(), $.get("/something/else")).then(function(nested, other) {
    console.log("Complete.", nested, other);
});
控制台输出读数为:

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

由于某种原因,无法对上述答案添加评论

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

我也有同样的问题。正如你所看到的。返回的延迟对象声明它是“挂起的”:
实际上,您不需要额外的延迟对象。通过使用
then()
链接,您可以做您想做的事情:

我添加了一些逻辑,因为我认为这可能是您同步执行此操作的原因。之后,您可以在
$中使用结果。如果
如此:

$.when(nestedAjax()).done(function(){
    console.log("Complete");
});​
$.when(nestedAjax(), $.get("/something/else")).then(function(nested, other) {
    console.log("Complete.", nested, other);
});

如果必须按顺序进行,为什么不首先执行同步请求呢?别想把方形的钉子塞进圆孔里。你说得对。谢谢你的叫醒电话。我已经设法重新安排并实现了我想要的功能。不过,我仍然感兴趣的是,是否有一种方法可以从嵌套的ajax调用中“收集”延迟对象以进行评估,所以我的问题仍然存在。这很公平。:)我在这里可能没有偏离基准-现在已经很晚了,我一直在工作-但也许在每次AJAX调用的回调函数中,您可以将对象添加到数组中?您可以将数组作为参数传递给链,也可以将其保留在全局空间中。谢谢,我已经更经常地使用它们,现在我明白了为什么我不能完全按照我所尝试的那样做。谢谢你的帮助。当然!!我已经用头撞了几小时了,只是没有接通。谢谢你,博士!!是的,你完全正确。这是我得出的结论,在我的情况下,有多个AJAX请求在同一个函数中执行。我的问题的最接近的解决方案是使用
$.ajaxComplete()
,尽管我重新设计了我的方法并使其干净地工作。但是请注意,如果你不这样做的话。该事件最终将在对象解析/拒绝后触发。那是我的问题。我的对象返回了一个“挂起”状态()…几秒钟后它发生了变化,我的事件开始触发。在python中,有一种能力可以从控件结构中
生成
结果。这似乎是我所需要的,在这里,多个ajax调用可以产生一个结果,并且在收到所有结果后,可以解析一个“主”延迟对象。很明显,与一种语言斗争以从中获得某种行为通常是一种迹象,表明重新设计这种方法是必要的。我认为这里的问题是Ajax如何工作。从这个意义上讲,它是异步的,就像线程一样。使用Ajax和延迟对象,可以链接Ajax调用。我可以发布一些关于我如何解决问题的代码?我遇到的问题是,一个ajax调用需要返回到另一个ajax调用,它们都会生成一个结果,然后发送回调用方。这不是最好的代码…它可能可以优化,但对我来说很有效。我可以发布我的代码,如果它有任何帮助的话?我这里没有if/else。这会阻止发出第二个调用吗?请解释。是的,只有第一个调用的结果是真实的,才会发出第二个Ajax调用。@dmnd:我想你的意思是“如果第一个调用的结果是虚假的。”