Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lua-promise

JS-style Promise implementation for Lua, powered by libuv.

安装依赖

luarocks install luv

项目结构

lua-promise/
├── promise.lua              # 源码
├── lua-promise-1.0.0-1.rockspec
└── README.md

在其他项目中使用

方式一:Git Submodule(推荐)

# 在你的项目中添加为 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 文件夹使用

使用

Lua 代码

-- 设置路径(指向 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()

API

方法 说明
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 Promise 对照

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)

About

Implement for lua o that I can perform asynchronous programming more conveniently

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages