2013-07-03 31 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