我正在使用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函数
做他的工作。
答案 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();
}