-->

与嵌套Ajax调用jQuery的Deferred对象(jQuery deferred object

2019-06-27 19:36发布

我在这我的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.

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

Answer 1:

这其实很简单。 虽然所有的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();
};


Answer 2:

你实际上并不需要一个额外的延迟对象。 你可以做你想做的与链接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);
});


Answer 3:

Couldn't添加评论因故上面的回答。

所以我在这里添加我的意见。 如果Ajax调用快速返回之前返回dfd.promise()以上的答案才有效。

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



文章来源: jQuery deferred object with nested ajax calls