SignalR:在调用方法之前等待连接重新建立

时间:2016-01-27 07:53:15

标签: javascript asp.net signalr

我有一个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

断开连接后,我会持续连接到服务器

1 个答案:

答案 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服务以设置重试次数。

希望这有帮助。