信号器Javascript客户端代理多个事件

时间:2013-12-22 09:46:32

标签: signalr signalr-hub signalr.client

我查看了signalr hubs api guide javascript client proxy文档。我知道如何在不覆盖函数的情况下附加相同的客户端函数。但是当谈到启动功能时,我找不到任何关于它的信息。只是一些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();
})

所以问题的根本原因是我有不同的ViewModel javascript文件,我应该在同一个页面中启动它们。这意味着我必须将$ .connection.hub.start()函数带到页面底部的某个位置。但是那些javascript文件没有任何关系,所以当一个工作时,其他可能没有。当一个javascript文件启动集线器时,其他人可能想要修改客户端对象并再次启动它。所以AFAIK这不是一个好主意。我还检查了this question,但它没有给我一个很好的解决方案。

1 个答案:

答案 0 :(得分:2)

使用start()返回一个promise并在满足时添加多个处理程序这一事实。

promise是一个jQuery Deferred对象:http://api.jquery.com/category/deferred-object/

$(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();
});