gpt4 book ai didi

javascript - 在 .done 之外调用函数时,SignalR 不会调用服务器集线器方法

转载 作者:行者123 更新时间:2023-12-03 02:58:26 24 4
gpt4 key购买 nike

我一直在尝试在我的游戏中实现 signalR 来处理实时更新玩家位置,并将其广播给所有连接的客户端。

但是,调用服务器集线器方法的客户端函数永远不会到达服务器,除非我在 $.connection.hub.start().done() 之后直接调用它。让我给你举个例子......

这正确调用了服务器集线器方法 UpdatePlayerPosition,但我不想直接在 .done 上调用此方法:

$.connection.hub.start().done(function () {
$.connection.playerHub.server.updatePlayerPosition(playerObj)
});

但是,如果我在主 gameEngine 对象上创建一个变量并稍后调用它,即每次玩家移动时,什么也不会发生。

$.connection.hub.start().done(function () {
gameEngine.updatePlayerPosition = function () {
$.connection.playerHub.server.updatePlayerPosition(playerObj)
//playerObj is a global variable
}
});

if (player.isMoving) {
gameEngine.updatePlayerPosition();
}

调用 gameEngine.updatePlayerPosition() 确实命中了正确的函数,并遍历了所有 signalr.js,但未命中服务器上的断点。

这是集线器代码(我还没有在集线器上添加更新播放器的功能,我只想先进行通信)

using Microsoft.AspNet.SignalR;
using RPGGameCS.Models.Player;

namespace RPGGameCS
{
public class PlayerHub : Hub
{
public void UpdatePlayerPosition(IPlayer player)
{
Clients.All.updatePlayerPosition(player);
}
}

}

我见过的所有 signalR 示例都将这些服务器调用绑定(bind)到单击事件,但我不想这样做。看起来这应该是可能的,但到目前为止我尝试过的都没有成功。我做错了什么吗?或者也许不可能以这种方式委托(delegate) singleR 函数?

编辑1***:看来它与我发送到集线器方法的玩家对象有关。当我将玩家对象设置为空时,通信似乎工作正常。但是当我发送实际的玩家对象时,断点永远不会被命中。

最佳答案

方法签名必须匹配。

在您的集线器中,您有一个参数IPlayer,而在客户端上,您没有设置此参数。 gameEngine.updatePlayerPosition();public void UpdatePlayerPosition(IPlayer player)

不匹配

如果您调用例如 gameEngine.updatePlayerPosition(); signalr 根据名称和参数在连接的集线器上搜索方法。如果它找不到方法,我认为您应该在日志中找到它。

启用日志进行测试:

$.connection.hub.logging = true;
$.connection.hub.start();

( https://learn.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing )

关于javascript - 在 .done 之外调用函数时,SignalR 不会调用服务器集线器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47518111/

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