我有一个HubProxy,其中包含许多客户端触发的方法,如下所述:
proxy.invoke('hub_Subscribe');
proxy.invoke('triggerOnServer');
proxy.invoke('dataToServer',someModel);
现在,如果信号器不连接到服务器,并且我尝试调用上述任何方法,则会给我Connection must be started before data can be sent.
或Connection was disconnected before invocation result was received.
错误。
我知道可以利用connection.stateChanged
来确认signalR是否已连接,并相应地调用方法。但是需要记录这些事件,以便一旦信号连接启动就可以调用它们。
那么,如果连接断开,是否有一种简单的方法来记录这些方法?然后,一旦signalR连接启动并运行,调用这些方法?
像proxy.invoke('dataToServer',someModel).WaitForSignalRToBeConnected();
注意:在客户端使用THIS
断开连接后,我会持续连接到服务器答案 0 :(得分:0)
您需要的是使用$q
服务的承诺。
我假设你必须首先初始化集线器连接,然后按顺序调用所有其他三个方法。
如果您还没有用于管理与signalR服务器的通信的服务,请创建一个服务。在其中注入$q
服务和signalR。
以单独的方法包装以下每个命令:
function doInitialize() {
... // connect to signalR
return $q.when(connection.hub.start());
};
function doHubSubscribe() {
return $q.when(proxy.invoke('hub_Subscribe'));
};
function doTriggerOnServer() {
return $q.when(proxy.invoke('triggerOnServer'));
};
function doDataToServer() {
return $q.when(proxy.invoke('dataToServer',someModel));
};
现在,从您的控制器,您可以以第一个需要传递的方式对服务的方法进行嵌套调用,以便运行下一个:
function initSignalR() {
return service.doInitialize().then(function () {
return service.doHubSubscribe();
}).then(function () {
return service.doTriggerOnServer();
}).then(function () {
return service.doDataToServer();
})
};
修改强>
如果您想为invokations添加更多处理,可以使用jQuery .done()
和.fail()
方法,如下所示:
function sendDataToServer() {
$q.when(proxy.invoke('dataToServer', someModel))
.done(function (result) {
deferred.resolve(result);
console.log('success!');
})
.fail(function () {
deferred.reject();
console.error('Error invoking server!');
}));
return deferred.promise;
};
您可以向.fail()
方法添加更多处理代码,例如添加$timeout
服务以设置重试次数。
希望这有帮助。