【发布时间】:2018-06-05 11:10:58
【问题描述】:
我在没有运气的情况下搜索了这个问题的答案。我只发现了人们将回调传递给调用者函数的例子,但还没有看到调用者实际上是如何在内部执行回调函数代码的。如果有人可以为此提供一个示例和解释,将不胜感激。
我从功能的角度了解回调是如何工作的,我已经在其他语言中使用过它们。我只是无法弄清楚如何在 lua 中正确执行此操作的语法。我要么执行错误的回调参数,要么错误地将其传递给调用者函数。
这是我正在尝试做的一些伪代码,只是一个简单的例子,所以我可以看到它的工作原理。 (我是视觉学习者)
callback = function ()
... do stuff ...
end
function caller(callback)
callback()
end
-- run caller function
caller(callback)
编辑: 我得到了一些答案,说我上面的例子有效,而且看起来确实有效。谢谢你,但我想我应该更具体一些,因为尽管语法正确,但我的实际代码无法正常工作。
我正在为使用基本模式的 FiveM 服务器进行一些编码。我试图在脚本中使用回调来清理代码,但它似乎没有触发回调函数。这是sn-ps...
客户端脚本:
RegisterNetEvent("parachute:callback")
AddEventHandler('parachute:callback', function(callback)
print("callback...")
callback()
end)
服务器脚本:
callback = function ()
print("callback fired")
GiveWeaponToPed(GetPlayerPed(-1), GetHashKey("GADGET_PARACHUTE"), 150, true, true)
SetPedComponentVariation(GetPlayerPed(-1), 5, 1, 0, 0)
end
TriggerEvent('es:addCommand', 'callback', function(source, args, user)
TriggerClientEvent("parachute:callback", source, callback)
end, {help = "TEST"})
在上面,print("callback...") 函数执行但callback() 函数不执行。我可以根据我添加的打印语句来判断。
对于那些不熟悉基本模式或 FiveM 脚本的人来说,要获得更多上下文,这里有一个客户端加载脚本和一个服务器加载脚本。在服务器中,TriggerEvent('es:addCommand', ... ) 添加了一个可以使用/<cmd name> 执行的命令。 TriggerClientEvent() 通过RegisterNetEvent() 和AddEventHandler() 创建的监听器在客户端启动一个事件。如您所见,您将回调传递给这些函数,以告诉它们在触发事件时要执行什么。回调函数本身只是给我的角色一个降落伞。但是,当我输入 /callback 时没有给出降落伞。
如果不是我最初想象的语法,会出现什么问题?
【问题讨论】:
-
只是一个刺,但你确定论点是正确的吗?你能把 args 和你的
print("callback...")一起转储吗?也许添加一个print('callback type: '..type(callback)),如果它是一个表for k,v in pairs(callback) do print('callback["'..tostring(key).."]: '..tostring(v)) end -
不确定 essentialmode 是如何工作的,但看起来您正在服务器上声明一个回调函数并将其与事件一起传递给客户端,以便客户端可以调用服务器上的函数。我怀疑这会起作用,我认为它们是孤立的环境。
-
是的,我相信这就是原因。我忽略了服务器和客户端有两个不同的地址空间的事实。如果您编辑答案以将其添加(为了完整起见),我会接受您的正确答案