可以将$ .post嵌套在另一个Deferred / Promise中

时间:2014-01-15 22:11:53

标签: jquery promise jquery-deferred

我似乎遇到了一些问题,在一个承诺中嵌入一个帖子而不会遇到时间问题(或者我认为它们是时间问题......)。在我的场景中,我需要在$ .when()内触发一个帖子,但是在完成之前它不能继续/返回。

对于Post,我有/没有嵌套$ .when的尝试,但我仍然没有运气。我把我的代码分解为只有1个部分,因为我的$ .when要大得多:

$.when(calcQualifier()).then(function (status) {
    $("#stuff").append(status);
    return calcTotals(); // working function, not shown
}).then(function (status) {
    $("#stuff").append("Complete");
});

function calcQualifier() {
    var def = $.Deferred();
    var serialized = "" //build json here (works fine)
        $.when(calcQualifier_Post(serialized)).then(function (status) {
            def.resolve("Qualifier Calculated <br/>");
            return def.promise();
        });
}

function calcQualifier_Post(serialized) {
    var def = $.Deferred();
    $.post("/Opportunity/CalculateQualifier/", serialized, 
      function (returnJson) {
        var qualifier = returnJson.Qualifier;
        //update view with qualifier results
        return def.promise();
    });
}

在上面的场景中,所有其他.then()项目都可以正常启动,但是任何带有Post的内容似乎都没有以正确的顺序触发。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

立即归还承诺(在解决之前)。如果不这样做,.when()不会获得对延迟对象的引用,以便知道它何时被解析。

$.when(calcQualifier()).then(function (status) {
    $("#stuff").append(status);
    return calcTotals(); // working function, not shown
}).then(function (status) {
    $("#stuff").append("Complete");
});

function calcQualifier() {
    var def = $.Deferred();
    var serialized = "" //build json here (works fine)
    $.when(calcQualifier_Post(serialized)).then(function (status) {
        def.resolve("Qualifier Calculated <br/>");
    });
    return def.promise();
}

function calcQualifier_Post(serialized) {
    var def = $.Deferred();
    $.post("/Opportunity/CalculateQualifier/", serialized, function (returnJson) {
        var qualifier = returnJson.Qualifier;
        //update view with qualifier results
        def.resolve(true);
    });
    return def.promise();
}