From 92f85fa9eaff8c1027c3ccd7cd089f9c43cd7916 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Sun, 11 May 2014 23:20:51 -0400 Subject: [PATCH] handle resolved/rejected promise --- mithril.js | 18 ++++++++++++------ tests/mithril-tests.js | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/mithril.js b/mithril.js index 6f2c3b54..ad11edbe 100644 --- a/mithril.js +++ b/mithril.js @@ -344,12 +344,14 @@ Mithril = m = new function app(window) { } m.deferred = function() { - var resolvers = [], rejecters = [] + var resolvers = [], rejecters = [], resolved, rejected var object = { resolve: function(value) { + resolved = value for (var i = 0; i < resolvers.length; i++) resolvers[i](value) }, reject: function(value) { + rejected = value for (var i = 0; i < rejecters.length; i++) rejecters[i](value) }, promise: m.prop() @@ -359,8 +361,8 @@ Mithril = m = new function app(window) { var next = m.deferred() if (!success) success = identity if (!error) error = identity - function push(list, method, callback) { - list.push(function(value) { + function callback(method, callback) { + return function(value) { try { var result = callback(value) if (result && typeof result.then == "function") result.then(next[method], error) @@ -370,10 +372,14 @@ Mithril = m = new function app(window) { if (e instanceof Error && e.constructor !== Error) throw e else next.reject(e) } - }) + } + } + if (resolved !== undefined) callback("resolve", success)(resolved) + else if (rejected !== undefined) callback("reject", error)(rejected) + else { + resolvers.push(callback("resolve", success)) + rejecters.push(callback("reject", error)) } - push(resolvers, "resolve", success) - push(rejecters, "reject", error) return next.promise } return object diff --git a/tests/mithril-tests.js b/tests/mithril-tests.js index 09a08c6a..d6c315d8 100644 --- a/tests/mithril-tests.js +++ b/tests/mithril-tests.js @@ -670,6 +670,24 @@ function testMithril(mock) { deferred2.resolve(2) return value1 === 1 && value2 === 2 }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/80 + var deferred = m.deferred(), value + deferred.resolve(1) + deferred.promise.then(function(data) { + value = data + }) + return value === 1 + }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/80 + var deferred = m.deferred(), value + deferred.reject(1) + deferred.promise.then(null, function(data) { + value = data + }) + return value === 1 + }) //m.sync test(function() {