2013-07-03 56 views
2

我有一個for循環的對象列表,在這些對象的某些條件下,我需要調用signal-r函數爲每個對象加載一些數據。 所有這些對象都充滿了從集線器返回的數據,我想繼續在客戶端進程。Javascript SignalR等到服務廣播所有消息

我的問題是我想能夠跟蹤所有的循環完成,然後繼續其餘的代碼。

var stratsList = new Array(); 

for (var cp = 0; cp < myPools.length; cp++) { 
    if (myPools.SubItems.length == 0) 
     conn.server.LoadData(myPools[cp].id); 

    $.each(myPools.SubItems, function (k, v) { 
     stratsList.push(v.name); 
    }); 
} 

for (var s = 0; s < stratsList.length; s++) { 
    //Do some other work once all SubItems on myPools are Loaded. 
} 

所以,基本上同時循環在myPools,我檢查每個myPools的子項目有數據加載。 如果未加載,我想加載數據,然後繼續。

當您調用signal-r函數時,答覆會進入另一個函數。所以我不知道如何跟蹤。

在此先感謝。

回答

0

我對JavaScript比較陌生,但我會對此採取一些措施。

var numPoolsToBeFilled = myPools.length; 

var doMoreWorkIfReady = function() { 
    if (numPoolsToBeFilled <= 0) { 
     for (var s = 0; s < stratsList.length; s++) { 
      // Do some other work once all SubItems on myPools are Loaded. 
     } 
    } 
}; 

for (var cp = 0; cp < myPools.length; cp++) { 
    if (myPools.SubItems.length == 0) 
     conn.server.LoadData(myPools[cp].id); 
    else 
     numPoolsToBeFilled--; 
} 
// ... other code omitted ... 

// just in case all pools were already filled 
doMoreWorkIfReady(); 

然後你的答覆/回調函數內...

numPoolsToBeFilled--; 
doMoreWorkIfReady(); 

我不知道你的代碼是如何組織的,所以你必須要搞清楚在哪裏把numPoolsToBeFilled和doMoreWorkIfReady這樣加載函數和回覆函數都可以訪問它們。

+0

令人驚歎......非常感謝。你的解決方案是完美:) – Nisho

+0

太好了,我很高興它爲你工作! – Andrew