gpt4 book ai didi

angularjs - SignalR:如何在集线器启动后添加客户端调用?

转载 作者:行者123 更新时间:2023-12-04 14:27:28 24 4
gpt4 key购买 nike

首先,我刚开始尝试将 SignalR 2 添加到我现有的 Angular SPA 项目中。

我有一个主 Controller ,它立即启动集线器,向客户端提供一些消息。在里面,我有几个子页面,每个页面都可以订阅不同的服务中心。问题是客户端没有收到消息,因为它是在主 Controller 中已经启动集线器后连接的。

作为测试,如果我在主 Controller 中注释掉集线器启动,则子 Controller 中的集线器工作正常。

从我读到的内容来看,您必须在启动集线器之前连接所有客户端调用,这是设计使然。我不明白……如果是服务,应该可以在集线器启动后随时订阅或取消订阅。为什么不?如何解决?

最佳答案

因为在 12 小时内没有回应(这在这方面很不寻常),我不得不自己四处寻找。我认为,我被 SO 关于相关问题的答案误导了,您必须在开始连接之前订阅所有客户端调用,例如here .我在 Hubs API Guide 中找到,一节说

Define method on client (without the generated proxy, or when adding after calling the start method)



因此,可以在连接启动后添加客户端方法。诀窍是使用所谓的“没有生成的代理”。该限制适用于“使用生成的代理”。

以下是我从 SignalR 入门教程中获取的工作示例。

这是使用“生成代理”的主 Controller :
$.connection.statusHub.client.updateStatus = function (status) {
$scope.status = status;
$scope.$apply();
}
$.connection.hub.start();

这是在使用“没有生成的代理”的子 Controller 中:
var connection = $.hubConnection();
var proxy = connection.createHubProxy('stockTickerHub');
proxy.on('updateStockPrice', function (stock) {
var st = $scope.stocks.firstOfKey(stock.symbol, 'symbol');
st.lastPrice = stock.lastPrice;
$scope.$apply();
});

var hub = $.connection.stockTickerHub;
connection.start().done(function () {
hub.server.getAllStocks().done(function (stocks) {
$scope.stocks = stocks;
});
});

请注意,如果我在子 Controller 中使用“生成的代理”,则它不起作用,如下所示:
var hub = $.connection.stockTickerHub;
hub.client.updateStockPrice = function (stock) {
var st = $scope.stocks.firstOfKey(stock.symbol, 'symbol');
st.lastPrice = stock.lastPrice;
$scope.$apply();
};

$.connection.hub.start().done(function () {
hub.server.getAllStocks().done(function (stocks) {
$scope.stocks = stocks;
});
});

为了证明“使用生成的代理”模式的局限性,如果我在主 Controller 中注释掉该代码,则此代码有效。

顺便说一句,我对指南中的有或没有生成代理的术语感到很困惑,并且在这两种情况下,它仍然被称为xxxProxy。他们找不到更好的名字吗?或者有人有解释?

关于angularjs - SignalR:如何在集线器启动后添加客户端调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25945136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com