模拟SIGNALR工作SYNCHRONOUS

时间:2015-01-24 20:14:31

标签: javascript signalr

我正在使用JavaScript客户端从SIGNALR Hub获取数据并且运行良好,但在某些情况下我需要模拟同步。例如,在我的JavaScript客户端的For循环中从数据库中获取参数。这是我简化的javascript

var results = []; // empty array to hold results

function test(){
var list = ['item 1','item 2,'item3',item 4']
    for(var i = 0;i<list.length;i++){
        // call to signalr hub
         $.connection.hub.start().done(function(){
            bip.server.getString( list[i] ).done(function(x){
              results.push(x)});
        });
       // end call signalr hub
    }
}

很可能,它不起作用,函数test()在中心服务器响应填充数组结果(在done()之前)之前返回。 signalr在调用bip.server.getSTring(...)时返回一个延迟对象; 但是,服务器返回.done()上的值,它也是一个延迟对象。

我的问题是:如何在.done(...之前避免使用javascript函数 做他的工作。

1 个答案:

答案 0 :(得分:0)

试试这个:

声明您的列表,结果和索引以跟踪您的数组

var results = []; // empty array to hold results
var list = ['item 1','item 2,'item3',item 4']
var currentndex = 0;

启动集线器并注册客户端响应处理程序

function start()
{
   // register client callback for when it comes back from the server
   $signalrhubs.hub.client.serverResponse

   // do other initializing stuff
   $.connection.hub.start().done(callServer);

}

准备好后调用服务器,根据数组的长度检查索引并增加它。

function callServer()
{         
     if(currentIndex <= list.length)
     {
         bip.server.getString( list[currentIndex ]);                
         currentIndex += 1;
     }
}

获得响应后,添加结果并再次调用服务器

function serverResponse(x)
{
     results.push(x)
     callServer();
}