Javascript 信号器:在调用方法之前,等待重新建立连接

Javascript 信号器:在调用方法之前,等待重新建立连接,javascript,asp.net,signalr,Javascript,Asp.net,Signalr,我有一个HubProxy,其中包含许多客户端触发的方法,如下所述: proxy.invoke('hub_Subscribe'); proxy.invoke('triggerOnServer'); proxy.invoke('dataToServer',someModel); 现在,如果signalr未连接到服务器,并且我尝试调用上述任何一种方法,它会告诉我必须在发送数据之前启动连接。或连接在收到调用结果之前断开。错误 我知道可以利用connection.stateChanged来确认信号器是否

我有一个HubProxy,其中包含许多客户端触发的方法,如下所述:

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。问题是,一旦建立了连接,然后连接变差,会发生什么?在此期间,客户端可以调用方法。在断开连接期间调用的方法需要以这样一种方式进行处理,即一旦信号器连接启动,就会再次调用它们。