SignalR JavaScript集线器代理订阅/事件处理的奇怪行为

时间:2015-06-24 16:56:17

标签: javascript signalr signalr-hub

我有一个名为EventHub的服务器端集线器,带有pub / sub(groups),我试图将JS客户端订阅到它发出的消息。消息和pub / sub工作正常。如果我在控制台中手动完成所有操作,它将按预期工作。但我看到了我无法弄清楚的奇怪行为......这似乎是一个可变的参考问题,但我已经尝试过很多东西而且没有任何东西可以修复它。

var mystore = {
    EventHub: null,
    Foo: { Bar: { Active: true }, Baz: { Active: true } },

    SetEventHub: function(hub) {
        this.EventHub = hub;
        for (var t in this.Foo) if (this.Foo.hasOwnProperty(t) && this.Foo[t].Active) {
            console.log('t',t);
            var eventName = t.toLowerCase();
            hub.server.subscribe(eventName).done(function(){
                console.log('eventName',eventName);
            });
        }
    }
};

$(document).ready(function () {
    $.connection.hub.start().done(function() {
        mystore.SetEventHub($.connection.eventHub);
    });
});

这将在控制台中输出:

t Bar
t Baz
(2) eventName baz

我希望它输出:

t Bar
t Baz
eventName bar
eventName baz

可能不是那个顺序,但是单独的bar / baz行而不是两个bar行。使用$.connection代替hub并不起作用;像var x = t+'';这样的各种事情(想一个奇怪的对象问题)并没有帮助。出于某种原因,只有最后一个" eventName"回调似乎已经被注册,并且正在覆盖之前的回调。但是,如果我手动执行多个回调,它们都会按预期注册并全部触发......这似乎是竞争条件或范围问题或类似的事情。我已经花了好几个小时在这里,并没有得到任何地方。 :(

更新:使用var f = function(){console.log('eventName',eventName);}也无法提供帮助。

1 个答案:

答案 0 :(得分:0)

我同意你的意见,这应该是客户端范围界定问题。您是否沿着这些方向尝试了某些内容(未经测试)?

var eventName = t.toLowerCase();
(function(en) {
    hub.server.subscribe(en).done(function(){
        console.log('eventName', en);
    });
})(eventName);

如果它有效,它可以改进,但它至少应该证明你有什么样的问题。