Lua-Async 协程的高级用法
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
Lua-Async 协程的高级用法的更多相关文章
- Lua的协程和协程库详解
我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...
- Lua的协程(coroutine)
-------------------------------------------------------------------------------- -- 不携带参数 ---------- ...
- Lua的协程基础
参考:Lua中的协同程序 coroutine http.lua 协同程序(Coroutine): 三个状态:suspended(挂起,协同刚创建完成时或者yield之后).running(运行). ...
- 用Lua的协程实现类似Unity协程的语句块
local co_time_tbl = {} setmetatable(co_time_tbl, { __len = function(o) for k, v in pairs(o) do count ...
- lua 15 协程-协同程序
转自:http://www.runoob.com/lua/lua-coroutine.html 什么是协同(coroutine)? Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈 ...
- Lua 协程coroutine
协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以 ...
- lua协程并发下载简单测试
下载8个1m大小文件,测试五次分别耗时12.038s,10.316s,8.955s,11.275s,9.499s(lua代码实现如下) require "socket" --hos ...
- [转]skynet Lua中的协程
Lua中的协程 http://www.outsky.org/code/lua-coroutine.html Sep 6, 2014 Lua中的协程和其他变量一样,都是第一类值(first-class ...
- lua编程之协程介绍
一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式 ...
随机推荐
- nyoj 259-茵茵的第一课 (python, input, print)
259-茵茵的第一课 内存限制:64MB 时间限制:3000ms 特判: No 通过数:23 提交数:36 难度:0 题目描述: 茵茵今年已经六年级了,爸爸给她报了一个学习程序设计的班. 第一节课上, ...
- nyoj 111-分数加减法 (gcd, switch, 模拟,数学)
111-分数加减法 内存限制:64MB 时间限制:1000ms 特判: No 通过数:20 提交数:54 难度:2 题目描述: 编写一个C程序,实现两个分数的加减法 输入描述: 输入包含多行数据 每行 ...
- ubuntukylin16.04LTS(乌班图麒麟版长期支持版,并非银河麒麟)安装体验
最近,国产银河麒麟版在政府部门推广使用.我有幸接触了,感觉还是不错的.这次政府软件正版化整改中,也列入了windows和银河麒麟的选项.我想试安装一下,可是没找到.就近找了它的类似系统ubuntuky ...
- 【论文阅读】Learning Dual Convolutional Neural Networks for Low-Level Vision
论文阅读([CVPR2018]Jinshan Pan - Learning Dual Convolutional Neural Networks for Low-Level Vision) 本文针对低 ...
- javaScript——label语句
第一次看见label语句是这样一个场景: function foo() {x: 1} 当时十分疑惑,为什么不报错呢?对象可以这样写? 后来知道这个是label语句,一般配合break和continue ...
- 在UEFI+GPT下使用rEFind实现Win10 + Kali2.0 双引导
转载自:在UEFI+GPT下使用rEFind实现Win10 + Kali2.0 双引导 https://www.linuxidc.com/Linux/2016-07/133717.htm
- 03_Matplotlib的基本使用
python利用Matplotlib.pyplot库绘制不同的图形,但是在显示中文时存在部分问题,一般在导入库后,添加如下代码: # 设置中文正常显示 plt.rcParams['font.sans- ...
- JS进阶面试题整理(仅仅整理我做错的题)
前几天看到掘金博客一篇文章,找到了这个JavaScript进阶问题列表:现在把地址贴出来,想找工作或者想要巩固自己JS的同学可以参考 该文档会不定时更新 一.箭头函数 箭头函数相当于匿名函数,并 ...
- Spring(Bean)1
Spring支持3种依赖注入的方式 (DI依赖注入)*属性注入 (配置bean set方法注入) <bean id="car" class="spring.bean ...
- 【Android - 控件】之MD - TabLayout的使用
TabLayout是Android 5.0新特性——Material Design中的一个控件,是一个标签页的导航条,常结合ViewPager完成页面导航. 和其他MD控件一样,使用TabLayout ...