• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua-Async 协程的高级用法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Lua-Async

这是一个基于协程的异步调用库, 该库的设计思路类似JavaScript的Promise, 但相比Promise, 它有更多的灵活性.

--  引入Async
local Async = require("Async")

--  创建Async
--  可传递参数到接下来的调用中
Async.New(...)

--  注册异步调用
Async.New(...)
:Ok(function(ok, no, ...) return no() end)  --  在Ok管道注册回调, 之后进入No管道
:No(function(ok, no, ...) return ok() end)  --  在No管道注册回调, 之后进入Ok管道
:Ok(function(ok, no, ...) return no() end)  --  在Ok管道注册回调, 之后进入No管道
:No(function(ok, no, ...) return ok() end)  --  在No管道注册回调, 之后进入Ok管道

--  异常捕获
Async.New(...)
:Error(function() print("捕获异常...") end) --  注册异常捕获函数
:Ok(function(ok, no, ...) return no() end)  --  在Ok管道注册回调, 之后进入No管道
:No(function(ok, no, ...) return ok() end)  --  在No管道注册回调, 之后进入Ok管道
:Ok(function(ok, no, ...) return no() end)  --  在Ok管道注册回调, 之后进入No管道
:No(function(ok, no, ...) return ok() end)  --  在No管道注册回调, 之后进入Ok管道

JavaScript Promise 对比

Js版本

new Promise((resolve, reject) => {
    resolve();  //  下一步
})
.then((resolve, reject) => {
    reject();  //  下一步
})
.catch(() => { 
    //  异常处理
})

Lua版本

require("Async").New()
:Ok(function(ok, no)
    return ok()     --  下一步
end)
:Ok(function(ok, no)
    return no()     --  下一步
end)
:No(function(ok, no)
    return no()     --  异常处理
end)

简单的使用例子

--  一个简易的定时器
local Timer = {
    mTasks = {}
}

--  为定时器插入一个任务
function Timer:Insert(tick, func)
    table.insert(self.mTasks, { mTick = os.clock() + tick, mFunc = func })
end

--  更新定时器
function Timer:Update(tick)
    local dels = {}
    local time = os.clock()
    for k, task in pairs(self.mTasks) do
        if task.mTick <= time then
            table.insert(dels, k)
            task.mFunc()
        end
    end

    for i, v in ipairs(dels) do
        self.mTasks[v] = nil
    end
end

--  3层嵌套异步调用
Timer:Insert(2, function() 
    print("clock: \t", os.date("%y-%m-%d %H:%M:%S"))
    Timer:Insert(2, function()
        print("clock: \t", os.date("%y-%m-%d %H:%M:%S"))
        Timer:Insert(2, function()
            print("clock: \t", os.date("%y-%m-%d %H:%M:%S"))
        end)
    end)
end)

--  通过Async 3层异步调用
require("Async").New()
:Ok(function(ok, no)
    Timer:Insert(2, function() print("Async clock: ", os.date("%y-%m-%d %H:%M:%S")) ok() end)
end)
:Ok(function(ok, no)
    Timer:Insert(2, function() print("Async clock: ", os.date("%y-%m-%d %H:%M:%S")) ok() end)
end)
:Ok(function(ok, no)
    Timer:Insert(2, function() print("Async clock: ", os.date("%y-%m-%d %H:%M:%S")) ok() end)
end)

while true do
    Timer:Update(os.clock())
end

**调用结果**
> C:\MyWork\Git\Lua-Async>lua demo.lua
> clock:          19-12-17 21:00:23
> Async clock:    19-12-17 21:00:23
> clock:          19-12-17 21:00:25
> Async clock:    19-12-17 21:00:25
> clock:          19-12-17 21:00:27
> Async clock:    19-12-17 21:00:27

调用结果
C:\MyWork\Git\Lua-Async>lua demo.lua

clock: 19-12-17 21:00:23

Async clock: 19-12-17 21:00:23

clock: 19-12-17 21:00:25

Async clock: 19-12-17 21:00:25

clock: 19-12-17 21:00:27

Async clock: 19-12-17 21:00:27

Github传送门


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua的面向对象,封装,继承,多态发布时间:2022-07-22
下一篇:
lua字符串分割函数[适配中文特殊符号混合]发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap