Javascript 信号器:在调用方法之前,等待重新建立连接
我有一个HubProxy,其中包含许多客户端触发的方法,如下所述:Javascript 信号器:在调用方法之前,等待重新建立连接,javascript,asp.net,signalr,Javascript,Asp.net,Signalr,我有一个HubProxy,其中包含许多客户端触发的方法,如下所述: proxy.invoke('hub_Subscribe'); proxy.invoke('triggerOnServer'); proxy.invoke('dataToServer',someModel); 现在,如果signalr未连接到服务器,并且我尝试调用上述任何一种方法,它会告诉我必须在发送数据之前启动连接。或连接在收到调用结果之前断开。错误 我知道可以利用connection.stateChanged来确认信号器是否
proxy.invoke('hub_Subscribe');
proxy.invoke('triggerOnServer');
proxy.invoke('dataToServer',someModel);
现在,如果signalr未连接到服务器,并且我尝试调用上述任何一种方法,它会告诉我必须在发送数据之前启动连接。或连接在收到调用结果之前断开。
错误
我知道可以利用connection.stateChanged
来确认信号器是否已连接,并相应地调用方法。但需要记录这些事件,以便在信号器连接启动后调用它们
那么,有没有一种简单的方法来记录这些方法,以防连接断开?然后,一旦信号器连接启动并运行,调用那些方法
类似于proxy.invoke('dataToServer',someModel.waitForSignalRTOBconnected()代码>
注意:在客户端断开连接后,我会继续使用连接到服务器,您需要的是使用$q
服务的承诺
我假设您必须首先初始化集线器连接,然后按照该顺序调用所有其他三个方法
如果您还没有用于管理与信号服务器通信的服务,请创建服务。在其中插入$q
服务和信号器
用不同的方法包装以下每个命令:
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();
})
};
编辑:
如果要向调用添加更多处理,可以使用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
服务以设置重试次数
希望这能有所帮助。我目前已通过以下承诺解决了此问题:
function GetOpenConnection() {
return new Promise((resolve, reject) => {
const msMax = 1000;
const msInc = 10;
var ms = 0;
var idInterval = setInterval(() => {
if (connection.connectionState == 1) {
clearInterval(idInterval);
resolve(connection);
}
ms += msInc;
if (ms >= msMax) {
clearInterval(idInterval);
reject(connection);
}
}, msInc);
});
}
用法:
console.log('before GetOpenConnection()');
GetOpenConnection().then((connection) => {
console.log('Connected: ', connection.connectionState);
// invoke functions here
}).catch((connection) => {
console.log('Not connected: ', connection.connectionState);
});
console.log('after GetOpenConnection()');
信号器客户端中没有类似于waitforsignalrtobconnected
的内容。我认为你需要自己维护一个消息队列。我希望SignalR团队会考虑它的版本3。问题是,一旦建立了连接,然后连接变差,会发生什么?在此期间,客户端可以调用方法。在断开连接期间调用的方法需要以这样一种方式进行处理,即一旦信号器连接启动,就会再次调用它们。