我查看了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,但它没有给我一个很好的解决方案。
答案 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();
});