18

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

我有一个函数可以在其生命周期内执行许多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.

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

4

3 回答 3

14

It's actually quite simple. Though all the AJAX calls are Deferred objects, I still use one for the method itself.

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();
};
于 2012-09-05T13:50:48.683 回答
7

您实际上并不需要额外的延迟对象。您可以通过链接来做您想做的事情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);
});
于 2013-03-07T21:53:31.490 回答
1

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

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

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

于 2012-09-13T09:23:06.747 回答