2013-03-22 185 views
2

我不得不麻煩來完成以下任務。 我有三個功能等待ajax顯示結果

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 /承諾?

謝謝

回答

1

如果我理解正確的話,resres3是相互獨立的,但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 
}); 

的想法是,以$.when()內的通話將自動解決,如果resres2res3已經是「正常」的返回值,但如果res2替換爲新promise$.when呼叫將等待待續,然後再繼續。

+0

謝謝你的回答。 (f1(p1),res2,f3(p3))中的「return $ .when(res,res2,res3)」這一行中。如果是這樣,我想我會發送另一個Ajax調用來獲得我已經有的結果:res [0]和res [3]。 res [0]和res3已準備好被解散,不依賴任何東西。只有res2取決於res [1] – 2013-03-22 16:27:55

+0

@ Bes-mM-bes no,該行意味着我所說的。當你傳遞的東西不是'$ .when'的承諾時,它隱含地被認爲是「解決的」,所以傳遞'(res,promise,res3)'只會等待(重新)解決中間值 - 另一個參數將作爲正常值傳遞給'.done'調用。 – Alnitak 2013-03-22 17:52:50

+0

完美!有用。謝謝。 – 2013-03-25 08:46:27