Signalr signarjavascript客户端代理多个事件

Signalr signarjavascript客户端代理多个事件,signalr,signalr-hub,signalr.client,Signalr,Signalr Hub,Signalr.client,我检查了文件。我知道如何附加相同的客户机函数而不重写该函数。但当谈到启动函数时,我找不到任何关于它的信息。只是一些javascript技巧。所以我创建了一个非常简单的示例。以下是我所做的和我想做的: 这里有一个非常简单的中心: [HubName("exampleHub")] public class ExampleHub : Hub { public void ExampleMessage() { this.Clients.All.message("This me

我检查了文件。我知道如何附加相同的客户机函数而不重写该函数。但当谈到启动函数时,我找不到任何关于它的信息。只是一些javascript技巧。所以我创建了一个非常简单的示例。以下是我所做的和我想做的:

这里有一个非常简单的中心:

[HubName("exampleHub")]
public class ExampleHub : Hub
{
    public void ExampleMessage()
    {
        this.Clients.All.message("This message goes to two different client method!");
    }
}
下面是javascript文件:

function ExampleViewModel(exampleHubProxy) {

    var self = this;

    self.init = function () {
        exampleHubProxy.invoke('exampleMessage');
    };
};

$(function () {
    var connection = $.hubConnection();
    var exampleHubProxy = connection.createHubProxy('exampleHub');
    var exampleViewModel = new ExampleViewModel(exampleHubProxy);

    exampleHubProxy.on('message', function (clientEvent1) {
        console.log(clientEvent1);
    });

    exampleHubProxy.on('message', function (clientEvent2) {
        console.log(clientEvent2);
    });

    $.connection.hub.start().done(exampleViewModel.init);
})
输出是两次“此消息发送到两个不同的客户端方法!”日志一切如我所料。这也是我在生成的代理中想要的,如下所示:

$(function () {
    var exampleHubProxy = $.connection.exampleHub;
    var exampleViewModel = new ExampleViewModel(exampleHubProxy);
    var anotherViewModel = new AnotherViewModel(exampleHubProxy);


    //I know this is not valid. I am looking for something like this.
    exampleHubProxy.client.message += function (clientEvent1) {
        console.log(clientEvent1);
    };

    exampleHubProxy.client.message += function (clientEvent2) {
        console.log(clientEvent2);
    };

    //Real question starts here
    //This is what I can't do in without generated proxies!
    $.connection.hub.start+=exampleViewModel.init;
    $.connection.hub.start+=anotherViewModel.init;

    $.connection.hub.start();
})
所以这个问题的根本原因是我有不同的ViewModelJavaScript文件,我应该在同一个页面中启动它们。这意味着我必须将$.connection.hub.start()函数带到页面底部的某个位置。但是这些javascript文件没有关系,所以当一个工作时,另一个可能不工作。当一个javascript文件启动中心时,另一个可能需要修改客户端对象并再次启动它。看来这不是个好主意。我也检查了,但它没有给我一个好的解决方案。

使用start()返回一个承诺的事实,并在实现时添加多个处理程序

承诺是一个jQuery延迟对象:


谢谢你帮了我大忙!现在我可以像我想象的那样创建架构了。我搜索了一个星期,不知道有那么容易。如何链接这些承诺也很好,例如:
startPromise.then(exampleViewModel.init)。then(anotherViewModel.init)
$(function () {
    var exampleHubProxy = $.connection.exampleHub;
    var exampleViewModel = new ExampleViewModel(exampleHubProxy);
    var anotherViewModel = new AnotherViewModel(exampleHubProxy);

    exampleHubProxy.on('message', function (clientEvent1) {
        console.log(clientEvent1);
    });

    exampleHubProxy.on('message', function (clientEvent2) {
        console.log(clientEvent2);
    });

    //Real question starts here
    var startPromise = $.connection.hub.start();
    // start() returns a promise
    startPromise.then(exampleViewModel.init);
    startPromise.then(anotherViewModel.init);

    $.connection.hub.start();
});