首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有嵌套ajax调用的jQuery延迟对象

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

Stack Overflow用户
提问于 2012-09-05 09:38:35
回答 3查看 12.2K关注 0票数 18

在这种情况下,我的ajax调用必须以特定的顺序执行。我曾在其他情况下使用过jQuery延迟对象,但似乎找不到一种方法来使其具有适当的行为。

我有一个在其生命周期内执行大量ajax请求的函数。部分请求会在其他请求成功回调时执行。

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

一个简化的例子是:

代码语言:javascript
复制
function nestedAjax() {
    $.get("/", function(){
        console.log("First ajax done.");
        $.get("/", function(){
            console.log("Second ajax done.");
        });
    });
};

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

代码语言:javascript
复制
$.when(nestedAjax()).done(function(){
    console.log("Complete");
});​

控制台输出为:

代码语言:javascript
复制
> First ajax done.
> Second ajax done.
> Complete.

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

代码语言:javascript
复制
> First ajax done.
> Complete.
> Second ajax done.

但显然这不是我所需要的。任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-05 21:50:49

这实际上很简单。尽管所有的AJAX调用都是延迟对象,但我仍然对方法本身使用延迟对象。

代码语言:javascript
复制
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();
};
票数 14
EN

Stack Overflow用户

发布于 2013-03-08 05:53:31

实际上,您不需要额外的延迟对象。您可以通过使用then()链接来执行您想要的操作

代码语言:javascript
复制
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中使用结果,如下所示:

代码语言:javascript
复制
$.when(nestedAjax(), $.get("/something/else")).then(function(nested, other) {
    console.log("Complete.", nested, other);
});
票数 7
EN

Stack Overflow用户

发布于 2012-09-13 17:23:07

由于某种原因,无法在上面的答案中添加评论。

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

我也有同样的问题。如你所见。返回的延迟对象声明它是“挂起的”:http://jsfiddle.net/BtEKa/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12273437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档