2014-01-30 107 views
0

有沒有辦法使用jquery.when以特定順序執行多個調用? 客戶第一,第二班,第三個參數,可以等

$.when(
    service.doCall('GET', 'customers'), 
    service.doCall('GET', 'shifts'), 
    service.doCall('GET', 'params'), 
    service.doCall('GET','columns') 
).then(function(customers, shifts, params, columns) {} 

每次調用返回延期的承諾,其與調用的結果解決。 我想要以特定順序執行它們的原因是因爲我顯示的模式顯示哪個調用正在執行以及哪個調用正在執行。在我的服務類中,我在通話完成後使用自定義事件通知。例如,當客戶被加載時:

loadingPopup.loadingCustomers.notify(); 

然後在我的彈出式類中,我監聽這些事件,如下所示。但是由於調用是以隨機順序執行的,所以我的事件以錯誤的順序被觸發。

me.loadingCustomers.attach(function() { 
    me.loadCustomersBusy(false); 
    me.loadCustomersDone(true); 
    me.loadShiftsBusy(true); 
}); 

me.loadingShifts.attach(function() { 
    me.loadShiftsBusy(false); 
    me.loadShiftsDone(true); 
    me.loadParamsBusy(true); 
}); 

me.loadParams.attach(function() { 
    me.loadParamsBusy(false); 
    me.loadParamsDone(true); 
    me.loadColumnsBusy(true); 
}); 
+0

你是什麼意思的特定順序 –

+0

類似客戶完成後,後移,然後PARAMS,然後再當params爲在發來的請求列 –

+0

@ArunPJohny編輯 – Stvenoo

回答

1

的解決方案是使用$.when開始的調用鏈:

service.doCall('GET', 'customers').then(function() { 
    return service.doCall('GET', 'shifts') 
}).then(function() { 
    return service.doCall('GET', 'params') 
}).then(function() { 
    return service.doCall('GET','columns') 
}).then(...) 

注意,這不會給你的$.when然後自動調用所有四個結果的好處,所以雖然你不應該使用$.when開始的通話,你可以用它來創建額外的承諾,當解決的時候會通過的結果全部 previo我們打電話。

var def = []; 
def[0] = service.doCall('GET', 'customers'); 
def[1] = def[0].then(function() { return service.doCall('GET', 'shifts') }); 
def[2] = def[1].then(function() { return service.doCall('GET', 'params') }); 
def[3] = def[2].then(function() { return service.doCall('GET', 'columns') }); 

$.when.apply($, def).then(function(customers, shifts, params, columns) { 
    ... 
}); 

在這種情況下,我創建推遲對象的數組,但每個連續的AJAX調用沒有啓動,直到前一個已完成。然後它使用$.when.apply($, def)將所有四個延遲對象結果傳遞給最終回調。

+0

缺少'service.doCall'前面的'return'來確保回調函數返回promise。否則正確的解決方案。 –

+0

@Hans啊,是的,我沒有妥善鎖定電話...將修復,謝謝。 – Alnitak

+0

@Alnitak很好的解決方案,完美的作品。謝謝! – Stvenoo