diff options
-rw-r--r-- | spec/util_promise_spec.lua | 21 | ||||
-rw-r--r-- | util/promise.lua | 4 |
2 files changed, 21 insertions, 4 deletions
diff --git a/spec/util_promise_spec.lua b/spec/util_promise_spec.lua index 597b56f8..75e9294e 100644 --- a/spec/util_promise_spec.lua +++ b/spec/util_promise_spec.lua @@ -30,6 +30,27 @@ describe("util.promise", function () r("foo"); assert.spy(cb).was_called(1); end); + it("ignores resolve/reject of settled promises", function () + local res, rej; + local p = promise.new(function (resolve, reject) + res, rej = resolve, reject; + end); + local cb = spy.new(function (v) + assert.equal("foo", v); + end); + p:next(cb, cb); + assert.spy(cb).was_called(0); + res("foo"); + assert.spy(cb).was_called(1); + rej("bar"); + assert.spy(cb).was_called(1); + rej(promise.resolve("bar")); + assert.spy(cb).was_called(1); + res(promise.reject("bar")); + assert.spy(cb).was_called(1); + res(promise.resolve("bar")); + assert.spy(cb).was_called(1); + end); it("allows chaining :next() calls", function () local r; local result; diff --git a/util/promise.lua b/util/promise.lua index 1762d501..d8f0b3d6 100644 --- a/util/promise.lua +++ b/util/promise.lua @@ -57,9 +57,7 @@ local function promise_settle(promise, new_state, new_next, cbs, value) end local function new_resolve_functions(p) - local resolved = false; local function _resolve(v) - if resolved then return; end resolved = true; if is_promise(v) then v:next(new_resolve_functions(p)); @@ -69,8 +67,6 @@ local function new_resolve_functions(p) end local function _reject(e) - if resolved then return; end - resolved = true; if promise_settle(p, "rejected", next_rejected, p._pending_on_rejected, e) then p.reason = e; end |