handle resolved/rejected promise

This commit is contained in:
Leo Horie 2014-05-11 23:20:51 -04:00
parent b23ffd1aee
commit 92f85fa9ea
2 changed files with 30 additions and 6 deletions

View file

@ -344,12 +344,14 @@ Mithril = m = new function app(window) {
} }
m.deferred = function() { m.deferred = function() {
var resolvers = [], rejecters = [] var resolvers = [], rejecters = [], resolved, rejected
var object = { var object = {
resolve: function(value) { resolve: function(value) {
resolved = value
for (var i = 0; i < resolvers.length; i++) resolvers[i](value) for (var i = 0; i < resolvers.length; i++) resolvers[i](value)
}, },
reject: function(value) { reject: function(value) {
rejected = value
for (var i = 0; i < rejecters.length; i++) rejecters[i](value) for (var i = 0; i < rejecters.length; i++) rejecters[i](value)
}, },
promise: m.prop() promise: m.prop()
@ -359,8 +361,8 @@ Mithril = m = new function app(window) {
var next = m.deferred() var next = m.deferred()
if (!success) success = identity if (!success) success = identity
if (!error) error = identity if (!error) error = identity
function push(list, method, callback) { function callback(method, callback) {
list.push(function(value) { return function(value) {
try { try {
var result = callback(value) var result = callback(value)
if (result && typeof result.then == "function") result.then(next[method], error) 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 if (e instanceof Error && e.constructor !== Error) throw e
else next.reject(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 next.promise
} }
return object return object

View file

@ -670,6 +670,24 @@ function testMithril(mock) {
deferred2.resolve(2) deferred2.resolve(2)
return value1 === 1 && value2 === 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 //m.sync
test(function() { test(function() {