2012-06-05 18 views
3

這是我第一次使用$.when,我對語法有困難。
我的代碼與下面的簡化示例類似。它的工作原理(如果我簡化它時沒有導致錯誤)。 我的問題是,我不知道數組將包含customerIds數組將包含的許多元素。

var customerIds = new [1, 2, 3]; 

$.when(
    getCustomerData(customerIds[0]), 
    getCustomerData(customerIds[1]), 
    getCustomerData(customerIds[2]) 
).then(function() { 
    alert('success'); 
}).fail(function() { 
    alert('error'); 
}); 

function getCustomerData(int id) { 
    return new $.Deferred(function(defer) { 
        doSomeWork(id, defer); 
    }).promise();  
} 

我想寫如下$.when聲明,但難以獲得正確的語法。

$.when(
    getCustomerDataCalls(customerIds), 
).then(function() { 
    alert('success'); 
}).fail(function() { 
    alert('error'); 
}); 

凡爲getCustomerDataCalls實現:

function getCustomerDataCalls(customerIds) { 
    var dfds = []; 

    for (var id in customerIds) { 
     dfds.push(new $.Deferred(function(defer) { 
            doSomeWork(id, defer); 
           }).promise());  
    } 

    return dfds; 
} 

不幸的是什麼是錯我的執行,我想不通,我要去的地方錯了。我最好的猜測是,返回數組當事情錯了Deferred小號

更新:
我更新的代碼之後lanzz提到,我人爲的例子已經返回遞延,我更新了我的例子包括doSomeWork

+1

你並不需要實例化一個新的'Deferred'每個'$獲得()'調用 - '$獲得()'已經返回,你可以使用 – lanzz

+0

'變種DFDS承諾=新[ ];'是一個錯字? – fcalderan

+0

@ F.Calderan錯別字,謝謝你糾正我。 –

回答

15

是的,我也偶然發現:when不容易傳遞數組。但是你可以使用apply來達到預期的效果。

$.when.apply($, getCustomerDataCalls(customerIds)) 
+0

在我看來,默認情況下應該提供這種行爲 - 即如果第一個參數是一個數組,而第二個參數是一個函數,那麼當數組中的所有東西完成時,用結果數組調用該函數。事實上,如果您事先知道有多少延遲調用,那麼您可以輕鬆地自行編寫代碼,因此它的用處不大。 – podperson