Lua-Async 協程的高階用法
阿新 • • 發佈:2019-12-18
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傳送