diff options
Diffstat (limited to 'lua/nvim-lsp-installer/core/async/init.lua')
| -rw-r--r-- | lua/nvim-lsp-installer/core/async/init.lua | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/lua/nvim-lsp-installer/core/async/init.lua b/lua/nvim-lsp-installer/core/async/init.lua index a9c1704c..1dd2c138 100644 --- a/lua/nvim-lsp-installer/core/async/init.lua +++ b/lua/nvim-lsp-installer/core/async/init.lua @@ -6,15 +6,23 @@ local Promise = {} Promise.__index = Promise function Promise.new(resolver) - return setmetatable({ resolver = resolver }, Promise) + return setmetatable({ resolver = resolver, has_resolved = false }, Promise) +end + +---@param success boolean +---@param cb fun() +function Promise:_wrap_resolver_cb(success, cb) + return function(...) + if self.has_resolved then + return + end + self.has_resolved = true + cb(success, ...) + end end function Promise:__call(callback) - self.resolver(function(...) - callback(true, ...) - end, function(...) - callback(false, ...) - end) + self.resolver(self:_wrap_resolver_cb(true, callback), self:_wrap_resolver_cb(false, callback)) end local function await(resolver) @@ -28,9 +36,12 @@ end local function promisify(async_fn) return function(...) local args = table_pack(...) - return await(function(resolve) + return await(function(resolve, reject) args[args.n + 1] = resolve - async_fn(unpack(args, 1, args.n + 1)) + local ok, err = pcall(async_fn, unpack(args, 1, args.n + 1)) + if not ok then + reject(err) + end end) end end |
