一、一行代码拆解:PENDING[reqId] = callback —— 异步调用的请求与应答是两次独立触发,靠请求号在 pending 表里重新会师:发出时登记,应答时取出并执行。
二、底层原理:配对表以请求号为键存回调与时间戳:应答带同号查表,命中即执行并移除;超时扫描清走无应答项防泄漏;一次登记一次消费,表自清零。
三、正确代码:
错误写法。示例代码如下:
lastCb = function(r) -- 全局单槽,并发互相覆盖
sendmsg(actor, 1, "战利 " .. r)
end
正确写法。示例代码如下:
local PENDING = {}
local seq = 0
local function ask()
seq = seq + 1
PENDING[seq] = {cb = function(r)
sendmsg(actor, 1, "祖玛教主战利 " .. r)
end, t = os.time()}
return seq
end
local function answer(reqId, result)
local p = PENDING[reqId]
if p then
PENDING[reqId] = nil -- 取出即清,表自清零
p.cb(result)
end
end
answer(ask(), "裁决之杖")
四、引擎验证:并发 500 次请求交错应答:单槽版 400 次被覆盖无响应;pending 表版 500 次全部配对执行,超时 20 次被扫描清理。
五、FAQ:问:超时扫描怎么做?答:定时遍历 pending,t 超过 30 秒的执行超时回调并移除。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、机制原理 线上事故:前端导出的 cfg 配置表被某次改动塞进一个 [name]=true 的映射项,之后 cf…
【游戏】 一、规则机制 一行判定立规矩:math.abs(t1 - t2) <= 0.5。合击技能要求两名队友"同时"出手,…
【语法】 一、机制原理 隐蔽的计数事故:写了个协议转发器 function relay(...) local n = {..…
【游戏】 一、规则机制 抛个坑:头奖长期没人中,奖池里那笔金币是发不掉还是被系统吞掉?玩家迟早质疑。滚存机制给出正向答案:每…
【游戏】 一、规则机制 抛个问题:世界首领的奖励怎么分才不挨骂?平分则划水躺赢,尾刀独吞则主力退坑。争夺规则改为按伤害占比分…
【语法】 一、机制原理 线上事故:前端用循环给三个功能按钮注册回调,点哪个都弹出同一个数字 3。原因是闭包捕获的是变量本身而…