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() {
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

View file

@ -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() {