javascript - 为什么 SignalR 在收到所有更新之前发送调用的回调

标签 javascript asp.net .net signalr

我们有一个 signalR 中心和 JavaScript 客户端。在客户端,我们调用发送到服务器的集线器代理上的“启动”方法。服务器在准备就绪时将几条消息推送给客户端,然后完成。我们期望看到序列“Invoking ... event ... event ... event ... Invoked”,但我们看到的通常是“Invoking ... event .. . 事件 ... 已调用 ... 事件”。

这很糟糕,因为在 hub 调用完成后发生的 JavaScript 代码不是停止监听和生成最终摘要的可靠位置 - 如果我们在这里停止监听消息,我们很可能会丢失数据并显示“完成 95%”。

errorsHub.invoke('start', requestData)
  .done(function() { 
    // this will lose data
    errorsHub.off('errorsUpdate');
    showFinalSummary();
    });

如果没有“关闭”,控制台调试消息如下所示:

[14:36:23 GMT+0100 (GMT Standard Time)] SignalR: Invoking errorshub.start
[14:36:23 GMT+0100 (GMT Standard Time)] SignalR: Triggering client hub event 'errorsUpdate' on hub 'ErrorsHub'.
...
[14:36:24 GMT+0100 (GMT Standard Time)] SignalR: Invoked errorshub.start
[14:36:24 GMT+0100 (GMT Standard Time)] SignalR: Triggering client hub event 'errorsUpdate' on hub 'ErrorsHub'.

有时最后一次更新会在“调用”后不久出现,但最长可能会晚 6 秒。 我们经常会丢失最后一次更新,有时会丢失两次。

这个问题在 Firefox 中比在 Chrome 中更频繁。我们默认使用长轮询传输,因为服务器是 IIS 7.5

如果“Invoked, call done”消息与更新在同一个管道中发送,那么它如何超越管道中的最后一个更新?在服务器上,当我们调用 destination.errorsUpdate(someData) 时,这是已发送并确认、已发送还是只是排队等待发送?如果只是排队,有没有办法从服务器刷新连接,以确保已发送最后更新?

我们在 JavaScript 客户端中完全忽略 invoke(...).done 并检查更新以获取特殊消息信号完成是否会更好?

最佳答案

服务器端方法返回时调用 done() 处理程序,但它不保证服务器端方法触发的任何异步操作都已完成(调用客户端集线器方法不会发生在处理服务器端集线器方法的同一任务中,消息只是排队,然后由消息总线处理)。

我不确定你想做什么,所以很难给出有针对性的建议;一个简单的解决方案是创建一个客户端中心方法 showFinalSummary() 触发您当前在 done() 处理程序中执行的操作,然后从服务器调用此方法在适当的时候(例如,一旦您发送了所有错误更新)。

你的方法:

checking in the updates for a special message signalling completion

也可以。

关于javascript - 为什么 SignalR 在收到所有更新之前发送调用的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23246628/

相关文章:

c# - 在 ASP.NET 路由中扩展 RouteCollection

asp.net - 如何在 .NET 3.5 中使用 System.IdentityModel.Tokens.Jwt 5.2.1?

c# - 使用 ObjectDataSource 和 DataObjectTypeName,如何处理只有一个 Id 参数的删除方法?

c# - 何时/如何注销 RegisteredWaitHandle

javascript - 使用 Modular SDK v9 的 Firestore 条件 where 子句

javascript - 检测设备并交换 CSS 文件 - jQuery

Javascript 函数创建它自己的 <li></li>,但在此过程中删除网页上的所有其他 <li></li>

javascript - 渲染后更改 Highcharts 图例显示

.net - 找出两个列表之间的差异

c# - 模拟用户