diff --git a/mithril.js b/mithril.js index ad11edbe..708089c1 100644 --- a/mithril.js +++ b/mithril.js @@ -347,12 +347,14 @@ Mithril = m = new function app(window) { var resolvers = [], rejecters = [], resolved, rejected var object = { resolve: function(value) { - resolved = value + if (resolved === undefined) resolved = value for (var i = 0; i < resolvers.length; i++) resolvers[i](value) + resolvers.length = rejecters.length = 0 }, reject: function(value) { - rejected = value + if (rejected === undefined) rejected = value for (var i = 0; i < rejecters.length; i++) rejecters[i](value) + resolvers.length = rejecters.length = 0 }, promise: m.prop() } diff --git a/tests/mithril-tests.js b/tests/mithril-tests.js index d6c315d8..7c836372 100644 --- a/tests/mithril-tests.js +++ b/tests/mithril-tests.js @@ -688,6 +688,60 @@ function testMithril(mock) { }) return value === 1 }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/80 + var deferred = m.deferred(), value + deferred.resolve(1) + deferred.resolve(2) + 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.promise.then(function(data) { + value = data + }) + deferred.resolve(1) + deferred.resolve(2) + return value === 1 + }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/80 + var deferred = m.deferred(), value1, value2 + deferred.promise.then(function(data) { + value1 = data + }, function(data) { + value2 = data + }) + deferred.resolve(1) + deferred.reject(2) + return value1 === 1 && value2 === undefined + }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/80 + var deferred = m.deferred(), value1, value2 + deferred.promise.then(function() { + value1 = data + }, function(data) { + value2 = data + }) + deferred.reject(1) + deferred.resolve(2) + return value1 === undefined && value2 === 1 + }) + test(function() { + //https://github.com/lhorie/mithril.js/issues/80 + var deferred = m.deferred(), value + deferred.promise.then(null, function(data) { + value = data + }) + deferred.reject(1) + deferred.reject(2) + return value === 1 + }) //m.sync test(function() {