【问题标题】:SignalR in Layout and partial page布局和部分页面中的 SignalR
【发布时间】:2024-01-11 23:24:01
【问题描述】:

我想在布局和部分页面中使用 SignalR 集线器。 Here 被描述为使用hub.startdone 函数。

所以我的 html 页面中有两个脚本块,我想在其中使用 SignalR:

<script>
    $(document).ready(function () {
        window.hubReady = $.connection.hub.start();
        window.hubReady.done(function () {
            ...
        });
</script>

<script>
    $(document).ready(function(e) {
        window.hubReady.done(function() {
            ...
        });
    });
</script>

在第二个脚本块中,它说windows.hubReady.done 无法执行,因为它未定义。

编辑:块 2 在块 1 之前执行。但是为什么呢?

【问题讨论】:

  • 这两个就绪函数的顺序是否与您发布它们的顺序相同?
  • 是的,它们的顺序相同

标签: javascript asp.net-mvc signalr


【解决方案1】:

我的猜测是第二个回调在第一个回调之前执行,如果是这种情况,那么 window.hubReady 为 null,因为它是初始化 window.hubReady 的第一个回调。

我建议您不要创建对您的集线器的全局引用,而是直接引用它,即:

<script>
    $(document).ready(function(e) {
        $.connection.hub.connected(function() {
            ...
        });
    });
</script>

(如果这不起作用,那么我怀疑您的名为“hub”的集线器未在服务器上定义,但这是一个不同的问题)

【讨论】:

  • 第二个回调在第一个之前执行。所以第 1100 行在第 76 行之前执行。我不明白为什么。
  • 我想你的猜测是第二个回调是在 BEFORE 第一个执行的?
  • 这些行是按顺序执行的,但是函数不一定按照文档的顺序执行,因为它们是回调。决定执行顺序的是 jQuery。
  • 所以我不知道顺序有什么不好。 SignalR 中有什么东西可以测试集线器是否已经启动?
  • 好的,关于这个问题的新问题:*.com/questions/15066693/…
【解决方案2】:

我通过在我的部分 html 中不调用 $(document).ready(function(e) 而是调用 $(window).load(function() 解决了这个问题。然后$(window).load(function() 被称为第二个。

【讨论】:

  • 只是一个警告:它不是很可靠,如果将来发生变化,它可能会中断,例如。 jQuery-internals,脚本的顺序等。
最近更新 更多