Lua 异步封装

梦想游戏人
目录:
脚本语言

在lua里面的异步代码主要是通过闭包实现,结合asio,一些简单的封装,方便编写异步代码,比如异步的while,异步的for等

useage:

--[[
* Author: caoshanshan
* Email: me@dreamyouxi.com
异步lib 封装 方便快速写异步lua代码
@see useage
]]

local t = { }

-- 异步循环调用 直到成功 或者达到深度
-- cb需要执行的函数 第一个参数是async对象,调用async:_continue() 继续执行
-- auto_run  run auto ? if not you should call it manual
-- max run depth ,just for avoid run forever
function t.async_while_true(cb, auto_run, MAX_DEPTH)
    local depth = 0;
    if auto_run == nil then
        auto_run = true;
    end
    MAX_DEPTH = MAX_DEPTH or 1000;
    local obj = { };
    obj.run = true;
    obj.cb = cb;
    obj._continue = function(self)
        if self.run and depth < MAX_DEPTH then
            depth = depth + 1;
            self:cb();
        else
            --  print("  out of range");
        end
    end
    obj._break = function(self)
        self.run = false;
    end
    if auto_run then
        obj:_continue();
    end
    return obj;
end


return t;


useage:


function t.ttttt(ctx, msg, cb)
    local redis_key = redis_key.get_uuid_gen();

    async.async_while_true( function(async)
        redis.incr(redis_key, function(v)
            if v and v ~= "" then
                local ok = uuid_helper.check_is_valid(v);
                if ok then
                    local uuid = v;
                    cb(uuid);
                else
                    -- re gen
                    async:_continue();
                    return;
                end
            end
        end )
    end );
end
Scroll Up