mirror of
https://github.com/AmberGraceRblx/luau-promise.git
synced 2025-04-24 15:50:01 +00:00
parent
4e04458816
commit
9e51c039f7
2 changed files with 60 additions and 0 deletions
26
lib/init.lua
26
lib/init.lua
|
@ -222,6 +222,7 @@ local Promise = {
|
||||||
Status = makeEnum("Promise.Status", { "Started", "Resolved", "Rejected", "Cancelled" }),
|
Status = makeEnum("Promise.Status", { "Started", "Resolved", "Rejected", "Cancelled" }),
|
||||||
_getTime = os.clock,
|
_getTime = os.clock,
|
||||||
_timeEvent = game:GetService("RunService").Heartbeat,
|
_timeEvent = game:GetService("RunService").Heartbeat,
|
||||||
|
_unhandledRejectionCallbacks = {},
|
||||||
}
|
}
|
||||||
Promise.prototype = {}
|
Promise.prototype = {}
|
||||||
Promise.__index = Promise.prototype
|
Promise.__index = Promise.prototype
|
||||||
|
@ -1809,6 +1810,10 @@ function Promise.prototype:_reject(...)
|
||||||
-- Build a reasonable message
|
-- Build a reasonable message
|
||||||
local message = string.format("Unhandled Promise rejection:\n\n%s\n\n%s", err, self._source)
|
local message = string.format("Unhandled Promise rejection:\n\n%s\n\n%s", err, self._source)
|
||||||
|
|
||||||
|
for _, callback in ipairs(Promise._unhandledRejectionCallbacks) do
|
||||||
|
task.spawn(callback, self, unpack(self._values, 1, self._valuesLength))
|
||||||
|
end
|
||||||
|
|
||||||
if Promise.TEST then
|
if Promise.TEST then
|
||||||
-- Don't spam output when we're running tests.
|
-- Don't spam output when we're running tests.
|
||||||
return
|
return
|
||||||
|
@ -1986,4 +1991,25 @@ function Promise.fromEvent(event, predicate)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--[=[
|
||||||
|
Registers a callback that runs when an unhandled rejection happens. An unhandled rejection happens when a Promise
|
||||||
|
is rejected, and the rejection is not observed with `:catch`.
|
||||||
|
|
||||||
|
The callback is called with the actual promise that rejected, followed by the rejection values.
|
||||||
|
|
||||||
|
@param callback (promise: Promise, ...: any) -- A callback that runs when an unhandled rejection happens.
|
||||||
|
@return () -> () -- Function that unregisters the `callback` when called
|
||||||
|
]=]
|
||||||
|
function Promise.onUnhandledRejection(callback)
|
||||||
|
table.insert(Promise._unhandledRejectionCallbacks, callback)
|
||||||
|
|
||||||
|
return function()
|
||||||
|
local index = table.find(Promise._unhandledRejectionCallbacks, callback)
|
||||||
|
|
||||||
|
if index then
|
||||||
|
table.remove(Promise._unhandledRejectionCallbacks, index)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return Promise
|
return Promise
|
||||||
|
|
|
@ -35,6 +35,40 @@ return function()
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
describe("Unhandled rejection signal", function()
|
||||||
|
it("should call unhandled rejection callbacks", function()
|
||||||
|
local badPromise = Promise.new(function(_resolve, reject)
|
||||||
|
reject(1, 2)
|
||||||
|
end)
|
||||||
|
|
||||||
|
local callCount = 0
|
||||||
|
|
||||||
|
local function callback(promise, rejectionA, rejectionB)
|
||||||
|
callCount += 1
|
||||||
|
|
||||||
|
expect(promise).to.equal(badPromise)
|
||||||
|
expect(rejectionA).to.equal(1)
|
||||||
|
expect(rejectionB).to.equal(2)
|
||||||
|
end
|
||||||
|
|
||||||
|
local unregister = Promise.onUnhandledRejection(callback)
|
||||||
|
|
||||||
|
advanceTime()
|
||||||
|
|
||||||
|
expect(callCount).to.equal(1)
|
||||||
|
|
||||||
|
unregister()
|
||||||
|
|
||||||
|
Promise.new(function(_resolve, reject)
|
||||||
|
reject(3, 4)
|
||||||
|
end)
|
||||||
|
|
||||||
|
advanceTime()
|
||||||
|
|
||||||
|
expect(callCount).to.equal(1)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
describe("Promise.new", function()
|
describe("Promise.new", function()
|
||||||
it("should instantiate with a callback", function()
|
it("should instantiate with a callback", function()
|
||||||
local promise = Promise.new(function() end)
|
local promise = Promise.new(function() end)
|
||||||
|
|
Loading…
Reference in a new issue