handle resolved/rejected promise
This commit is contained in:
parent
b23ffd1aee
commit
92f85fa9ea
2 changed files with 30 additions and 6 deletions
18
mithril.js
18
mithril.js
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue