在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