JS-style Promise implementation for Lua, powered by libuv.
lua-promise/
├── promise.lua # 源码
├── lua-promise-1.0.0-1.rockspec
└── README.md
# 在你的项目中添加为 submodule
git submodule add https://github.com/canwhite/handle_it_once.git vendor/lua-promise
# 或者克隆到 vendor 目录
git clone https://github.com/canwhite/handle_it_once.git vendor/lua-promise
git clone https://github.com/canwhite/handle_it_once.git
# 取其中的 lua-promise 文件夹使用
-- 设置路径(指向 vendor/lua-promise)
package.path = "vendor/lua-promise/?.lua;" .. package.path
package.cpath = "vendor/lua-promise/lib/?.so;" .. package.cpath
local Promise = require("promise")
-- 基础用法
Promise.Delay(1000, "hello"):Then(function(msg)
print(msg)
end)
-- 链式调用
Promise.Resolve(1)
:Then(function(n) return n + 1 end)
:Then(function(n) return n * 2 end)
:Catch(function(err) print("error:", err) end)
:Finally(function() print("done") end)
-- 并发
Promise.All({
Promise.Delay(100, "A"),
Promise.Delay(50, "B")
}):Then(function(results)
print(results[1], results[2])
end)
-- 启动事件循环(脚本末尾调用一次)
Promise.Run()
-- main.lua
package.path = "vendor/lua-promise/?.lua;" .. package.path
package.cpath = "vendor/lua-promise/lib/?.so;" .. package.cpath
local Promise = require("promise")
local function fetchUser(id)
return Promise.Delay(100, {id = id, name = "User" .. id})
end
local function fetchOrders(user)
return Promise.Delay(80, {"order1", "order2"})
end
fetchUser(42)
:Then(function(user)
print("Got user:", user.name)
return fetchOrders(user)
end)
:Then(function(orders)
print("Orders:", table.concat(orders, ", "))
end)
:Catch(function(err)
print("Error:", err)
end)
:Finally(function()
print("Done")
end)
Promise.Run()
| 方法 |
说明 |
Promise.New(fn) |
创建 Promise |
Promise.Resolve(v) |
返回已 resolved 的 Promise |
Promise.Reject(err) |
返回已 rejected 的 Promise |
promise:Then(f, r) |
注册回调 |
promise:Catch(r) |
捕获错误 |
promise:Finally(f) |
无论如何都执行 |
Promise.All({...}) |
等待所有完成 |
Promise.Race({...}) |
竞速,返回第一个完成的 |
Promise.AllSettled({...}) |
等待所有完成,保留所有结果 |
Promise.Delay(ms, v) |
延时 |
Promise.Run() |
启动事件循环 |
| JS |
Lua |
new Promise((res, rej) => {}) |
Promise.New(function(Resolve, Reject) end) |
Promise.resolve(v) |
Promise.Resolve(v) |
Promise.reject(e) |
Promise.Reject(e) |
.then(a, b) |
:Then(a, b) |
.catch(e) |
:Catch(e) |
.finally(f) |
:Finally(f) |
Promise.all([...]) |
Promise.All({...}) |
Promise.race([...]) |
Promise.Race({...}) |
setTimeout(cb, ms) |
Promise.Delay(ms):Then(cb) |