Promise & Async in Lua
The goal of promise-async is to port Promise & Async from JavaScript to Lua.
A value returned by async function in JavaScript is actually a Promise Object. It's incomplete and inflexible for using an async function wrapped by bare coroutine without Promise in almost Lua implementation.
Luv is a default EventLoop for promise-async. It doesn't mean promise-async must require it. In fact, promise-async require a general EventLoop module which Luv like.
Install with Packer.nvim:
use {'kevinhwang91/promise-async'}
or
use_rocks {'promise-async'}
luarocks install promise-async
luarocks install luv
or implement an EventLoop
interface to adapt
your platformpromise-async's API is based on MDN-Promise. typings/promise.lua is the typings with documentation of Promise class.
Summary up the API different from JavaScript.
JavaScript | Lua |
---|---|
new Promise |
Promise:new /Promise |
Promise.then |
Promise:thenCall , then is language keyword |
Promise.catch |
Promise:catch |
Promise.finally |
Promise:finally |
Promise.resolve |
Promise.resolve |
Promise.reject |
Promise.reject |
Promise.all : Symbol.iterator as iterator |
Promise.all : pairs as iterator |
Promise.allSettled : Symbol.iterator as iterator |
Promise.allSettled : pairs as iterator |
Promise.any : Symbol.iterator as iterator |
Promise.any : pairs as iterator |
Promise.race : Symbol.iterator as iterator |
Promise.race : pairs as iterator |
async : as keyword at the start of a function |
Async /Async.sync : as a surrounding function |
await : as keyword |
await /Async.wait as a function |
The environment in Async.sync
function have been injected some new functions for compatibility or
enhancement:
await
: A reference of Async.wait
function;pcall
: Be compatible with LuaJIT;xpcall
: Be compatible with LuaJIT;async
in JavaScript return Promise object only with single result, but may carry multiple results
in Lua. The resolved result of Promise object return by async
function will be packed into a table
via {...}
. However, the result handled by await
will be unpacked and return multiple values.
local async = require('async')
local function f()
return 1, 2, 3
end
-- multiple results are packed into resolved result in Promise
async(f):thenCall(function(v)
print(v[1], v[2], v[3]) -- output: 1 2 3
end)
-- results returned by `await`
async(function()
local v1, v2, v3 = await(async(f))
print(v1, v2, v3) -- output: 1 2 3
end)
uv.run()
Promise.resolve():thenCall(cb)
is almost equivalent to vim.schedule(cb)
.make test
Following typings/README.md
TODO, refer to loop.lua
The project is licensed under a BSD-3-clause license. See LICENSE file for details.