【问题标题】:Wait for an ajax to display result等待ajax显示结果
【发布时间】:2013-03-23 00:15:39
【问题描述】:

我很难完成以下任务。 我有三个功能

function f1(param1) {
    var d = $.deferred();
    // ajax call with data param1
   d.resolve(res0, res1);
    return d.promise();
}
function f2(param2) {
    var d = $.deferred();
    // ajax call with data param2
    d.resolve(res2);
    return d.promise();
}

function f3(param3) {
   var d = $.deferred();
   // ajax call with data param3
   d.resolve(res3);
   return d.promise();
}

我是这样运行它们的:

$.when(f1(param1),f2(pram2),f3(param3)).done(function(res,res2,res3){

});

我的要求是:

如果 res2 为空,则运行 f2(res[1])。完成后显示res[0] + f2(res[1]) + res3

否则显示res[0] + res2 + res3

有没有人可以使用 jQuery/promises 帮助我解决这个问题?

谢谢

【问题讨论】:

    标签: jquery deferred promise


    【解决方案1】:

    如果我理解正确,resres3 是相互独立的,但如果 initial 调用,res2 可能依赖于 res[1]f2 产生了一个空结果。

    如果发生这种情况,您需要再次致电f2

    所以:

    $.when( f1(p1), f2(p2), f3(p3)).then(function(res, res2, res3) {
        if (!res2) {             // substitute appropriate "empty" test
            res2 = f2(res[1]);   // call f2 again, getting a new promise
        }
        return $.when(res, res2, res3);  // create new compound promise
    }).done(function(res, res2, res3) {
        // do your stuff
    });
    

    如果resres2res3 已经是“正常”返回值,那么对$.when() 的内部调用将自动解析,但如果res2 被替换为新的promise $.when 调用将等待 解决后再继续。

    【讨论】:

    • 谢谢你的回答。在 "return $.when(res,res2,res3)" 行中,您的意思是 $.when(f1(p1),res2, f3(p3))。如果是这样,我想我将发送另一个 ajax 调用以获得我已经拥有的结果:res[​​0] 和 res[3]。 res[0] 和 res3 已准备好显示,它们不依赖于任何东西。只有 res2 取决于 res[1]
    • @Bes-mM-bes 不,那条线的意思正是我所说的。当您将不是承诺的东西传递给$.when 时,它被隐含地视为“已解决”,因此传递(res, promise, res3) 只会等待中间值被(重新)解决 - 其他参数将被传递给@987654337 @调用正常值。
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2013-12-05
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多