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. nyoj 739 笨蛋难题四

    笨蛋难题四 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 这些日子笨蛋一直研究股票,经过调研,终于发现xxx公司股票规律,更可喜的是 笨蛋推算出这家公司每天的股价, ...

  2. js对象的sessionStorage,判断对象相等,判断是否包含某属性

    一,storage storage只能存储字符串的数据,对于JS中常用的数组或对象却不能直接存储 因此需要借JSON进行类型转化来存储: let obj = { name:'Jim' } sessio ...

  3. php为什么需要异步编程?php异步编程的详解(附示例)

    本篇文章给大家带来的内容是关于php为什么需要异步编程?php异步编程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我对 php 异步的知识还比较混乱,写这篇是为了 ...

  4. 【集训Day3 离散化】矩形覆盖

    矩形覆盖(planting) [问题描述] 给定在一个平面坐标系上的N(1 <= N <= 100)个矩形区域,这N个矩形可能有相互覆盖的部分.求平面上被所有矩形覆盖的总面积,重复部分只算 ...

  5. python接口自动化测试——简单的文件上传代码实现,人人网登陆后上传图片举例

    import requests '''人人网登陆,图片上传 '''def loginData(): '''登录请求参数''' data = { 'email': '13484545195', 'ico ...

  6. linux [CTRL]+c与[CTRL]+d

    [CTRL]+c:中断目前程序.用于在linux中输入了错误的命令或者参数,有的时候会在系统不停的运行,如果想让程序需停下来,可以使用[CTRL]+C [CTRL]+d:这个组合键代表着键盘输入结束( ...

  7. 插槽在父组件和子组件间的使用(vue3.0推荐)

    子组件: 父组件: 插槽在父组件和子组件间的使用(vue3.0推荐):在外面加一个template模板

  8. C语言基础——进制转换 / 数据表示

    第一部分:进制转换 二进制:由0~1构成,逢2进1 八进制:由0~7构成,逢8进1 十六进制:由0~9.A~F构成,逢16进1 两个基本概念 基数:n进制基数为n 123.4 = 1*10^2 + 2 ...

  9. 甲小蛙战记:PHP2Java 排雷指南

    (马蜂窝技术原创内容,申请转载请在公众后后台留言,ID:mfwtech ) 大家好,我是来自马蜂窝电商旅游平台的甲小蛙,从前是一名 PHP 工程师,现在可能是一名 PHJ 工程师,以后...... 前 ...

  10. C#异步案例一则

    场景 生产者和消费者队列, 生产者有多个, 消费者也有多个, 生产到消费需要异步. 下面用一个Asp.NetCore Web-API项目来模拟 创建两个API, 一个Get(), 一个Set(), G ...