mirror of
https://github.com/AmberGraceRblx/luau-promise.git
synced 2025-04-24 15:50:01 +00:00
Update await to use coroutine.yield
And add compatability with cancellation by returning nil.
This commit is contained in:
parent
617c2753bc
commit
cda921e793
1 changed files with 26 additions and 15 deletions
41
lib/init.lua
41
lib/init.lua
|
@ -389,23 +389,31 @@ function Promise.prototype:await()
|
|||
self._unhandledRejection = false
|
||||
|
||||
if self._status == Promise.Status.Started then
|
||||
local result
|
||||
local resultLength
|
||||
local bindable = Instance.new("BindableEvent")
|
||||
local ok, result, resultLength
|
||||
|
||||
self:andThen(
|
||||
function(...)
|
||||
resultLength, result = pack(...)
|
||||
bindable:Fire(true)
|
||||
end,
|
||||
function(...)
|
||||
resultLength, result = pack(...)
|
||||
bindable:Fire(false)
|
||||
end
|
||||
)
|
||||
local thread = coroutine.running()
|
||||
|
||||
local ok = bindable.Event:Wait()
|
||||
bindable:Destroy()
|
||||
spawn(function()
|
||||
self:andThen(
|
||||
function(...)
|
||||
resultLength, result = pack(...)
|
||||
ok = true
|
||||
end,
|
||||
function(...)
|
||||
resultLength, result = pack(...)
|
||||
ok = false
|
||||
end
|
||||
):finally(function()
|
||||
coroutine.resume(thread)
|
||||
end)
|
||||
end)
|
||||
|
||||
coroutine.yield()
|
||||
|
||||
if ok == nil then
|
||||
-- If cancelled, we return nil.
|
||||
return nil
|
||||
end
|
||||
|
||||
return ok, unpack(result, 1, resultLength)
|
||||
elseif self._status == Promise.Status.Resolved then
|
||||
|
@ -413,6 +421,9 @@ function Promise.prototype:await()
|
|||
elseif self._status == Promise.Status.Rejected then
|
||||
return false, unpack(self._values, 1, self._valuesLength)
|
||||
end
|
||||
|
||||
-- If the promise is cancelled, fall through to nil.
|
||||
return nil
|
||||
end
|
||||
|
||||
--[[
|
||||
|
|
Loading…
Reference in a new issue