Update await to use coroutine.yield

And add compatability with cancellation by returning nil.
This commit is contained in:
Eryn Lynn 2018-11-08 23:50:07 -05:00
parent 617c2753bc
commit cda921e793

View file

@ -389,23 +389,31 @@ function Promise.prototype:await()
self._unhandledRejection = false self._unhandledRejection = false
if self._status == Promise.Status.Started then if self._status == Promise.Status.Started then
local result local ok, result, resultLength
local resultLength
local bindable = Instance.new("BindableEvent")
self:andThen( local thread = coroutine.running()
function(...)
resultLength, result = pack(...)
bindable:Fire(true)
end,
function(...)
resultLength, result = pack(...)
bindable:Fire(false)
end
)
local ok = bindable.Event:Wait() spawn(function()
bindable:Destroy() 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) return ok, unpack(result, 1, resultLength)
elseif self._status == Promise.Status.Resolved then elseif self._status == Promise.Status.Resolved then
@ -413,6 +421,9 @@ function Promise.prototype:await()
elseif self._status == Promise.Status.Rejected then elseif self._status == Promise.Status.Rejected then
return false, unpack(self._values, 1, self._valuesLength) return false, unpack(self._values, 1, self._valuesLength)
end end
-- If the promise is cancelled, fall through to nil.
return nil
end end
--[[ --[[