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传送门

Lua-Async 协程的高级用法的更多相关文章

  1. Lua的协程和协程库详解

    我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...

  2. Lua的协程(coroutine)

    -------------------------------------------------------------------------------- -- 不携带参数 ---------- ...

  3. Lua的协程基础

    参考:Lua中的协同程序 coroutine   http.lua 协同程序(Coroutine): 三个状态:suspended(挂起,协同刚创建完成时或者yield之后).running(运行). ...

  4. 用Lua的协程实现类似Unity协程的语句块

    local co_time_tbl = {} setmetatable(co_time_tbl, { __len = function(o) for k, v in pairs(o) do count ...

  5. lua 15 协程-协同程序

    转自:http://www.runoob.com/lua/lua-coroutine.html 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈 ...

  6. Lua 协程coroutine

    协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以 ...

  7. lua协程并发下载简单测试

    下载8个1m大小文件,测试五次分别耗时12.038s,10.316s,8.955s,11.275s,9.499s(lua代码实现如下) require "socket" --hos ...

  8. [转]skynet Lua中的协程

    Lua中的协程 http://www.outsky.org/code/lua-coroutine.html Sep 6, 2014 Lua中的协程和其他变量一样,都是第一类值(first-class ...

  9. lua编程之协程介绍

    一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式 ...

随机推荐

  1. Python 面向对象-上篇

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...

  2. 【计算机网络】TCP基础知识详解

    1. TCP概念相关 [!NOTE] TCP(Transmission Control Protocol),又叫传输控制协议. TCP协议是面向连接的,可靠的,基于字节流的传输协议.在基于 TCP 进 ...

  3. gcc悄无声色将静态函数内联了

    说到内联,可能你还停在十几年前甚至二十多年前的C++教典,c++有内联关键字inline,甚至还用来与c做区分.c99开始c引入inline,gcc比c99早实现对inline支持,vc中c没有关键字 ...

  4. x86汇编分页模式实验 --《ORANGE'S一个操作系统的实现》中 pmtest8.asm解析

    序言(废话) : 在看书的过程中发现一开始不是很能理解pmtest8的目的,以及书上说得很抽象..于是在自己阅读过源代码后,将一些自己的心得写在这里. 正文 : 讲解顺序依然按照书上贴代码的顺序来.但 ...

  5. .NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端

    .NET Core love gRPC 千呼万唤的 .NET Core 3.0 终于在 9 月份正式发布,在它的众多新特性中,除了性能得到了大大提高,比较受关注的应该是 ASP.NET Core 3. ...

  6. MySQL数据库优化技巧有哪些?

    开启查询缓存,优化查询. explain你的select查询,这可以帮你分析你的查询语句或是表结构的性能瓶颈.EXPLAIN的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的 ...

  7. 正则表达式 第六篇:调用CLR函数执行正则查询

    在SQL Server数据库中可以执行模糊查询,像like子句,和全文查询(Fulltext search),但是无法直接执行正则查找,SQL Server没有执行正则表达式的内置函数,但是我们可以创 ...

  8. python3 之 内置函数enumerate

    python3 内置函数enumerate一.简介: 该函数在字面上是枚举.列举的意思,用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列, 同时列出数据和数据下标,一般用在 for ...

  9. linux runlevel运行级别

    1.linux通过设定runlevel来设定系统使用不同的服务启动,从而使得linux运行的环境有所不同. 2.当系统启动后会按照以下步骤完成初始化:运行/sbin/init程序加载器配置文件/etc ...

  10. 初探three.js材质

    这节我们浅谈一下THREE的材质.材质就是物体的皮肤,决定物体的表面.THREE的材质有很多种,他们有的和到相机的距离有关,有的和面的法向量角度有关,有的不受光照的影响,有的受到光照的影响会产生反射效 ...