我有一个名为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);}
也无法提供帮助。
答案 0 :(得分:0)
我同意你的意见,这应该是客户端范围界定问题。您是否沿着这些方向尝试了某些内容(未经测试)?
var eventName = t.toLowerCase();
(function(en) {
hub.server.subscribe(en).done(function(){
console.log('eventName', en);
});
})(eventName);
如果它有效,它可以改进,但它至少应该证明你有什么样的问题。