查看: 49|回复: 2

[Lua] 用协程实现非阻塞任务队列——告别定时器嵌套地狱

[复制链接]

46

主题

42

回帖

1212

积分

金牌会员

积分
1212
发表于 2026-6-4 23:59:30 | 显示全部楼层 |阅读模式
-- TaskQueue.lua
-- 用协程模拟异步序列,避免多层定时器嵌套导致代码难以维护

local TaskQueue = {}
TaskQueue.__index = TaskQueue

function TaskQueue.new()
    return setmetatable({ _queue = {} }, TaskQueue)
end

-- 添加一个延迟任务(delay单位:秒)
function TaskQueue:wait(delay, fn)
    table.insert(self._queue, { delay = delay, fn = fn })return self
end

-- 执行队列(依赖引擎的 SetTimer 或等效接口)
function TaskQueue:run()
    local elapsed = 0
    for _, task in ipairs(self._queue) do
        elapsed = elapsed + task.delay
        local capturedFn = task.fn
        SetTimer(elapsed * 1000, function()
            local ok, err = pcall(capturedFn)
            if not ok then print("[TaskQueue] 执行错误: " .. tostring(err)) end
        end)
    end
end

return TaskQueue



实例:

local TaskQueue = require("TaskQueue")

TaskQueue.new():wait(0,  function() BroadcastMap("传送门开启……") end)
    :wait(2,  function() PlayEffect("portal_open") end)
    :wait(3,  function() BroadcastMap("BOSS即将降临!") end)
    :wait(2,  function() SpawnMonster("暗影魔王", 100, 200) end)
    :wait(1,  function() BroadcastMap("战斗开始!") end)
    :run()

1

主题

228

回帖

1585

积分

金牌会员

积分
1585
发表于 2026-6-5 23:10:19 | 显示全部楼层
很厉害啊!学到了

25

主题

89

回帖

1323

积分

金牌会员

积分
1323
发表于 2026-6-6 00:35:05 | 显示全部楼层
快了快了,马上就能用VV了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表