fix handling of errors in promises
This commit is contained in:
parent
45b13165f6
commit
77d5484169
6 changed files with 48 additions and 22 deletions
|
|
@ -307,14 +307,20 @@ new function(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
|
||||||
resolvers.push(function(value) {
|
function push(list, method, callback) {
|
||||||
var result = success(value)
|
list.push(function(value) {
|
||||||
next.resolve(result !== undefined ? result : value)
|
try {
|
||||||
})
|
var result = callback(value)
|
||||||
rejecters.push(function(value) {
|
next[method](result !== undefined ? result : value)
|
||||||
var result = error(value)
|
}
|
||||||
next.reject(result !== undefined ? result : value)
|
catch (e) {
|
||||||
})
|
if (e instanceof Error && e.constructor !== Error) throw e
|
||||||
|
else next.reject(e)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
push(resolvers, "resolve", success)
|
||||||
|
push(rejecters, "reject", error)
|
||||||
return next.promise
|
return next.promise
|
||||||
}
|
}
|
||||||
return object
|
return object
|
||||||
|
|
@ -719,7 +725,7 @@ function testMithril(mock) {
|
||||||
test(function() {
|
test(function() {
|
||||||
var value
|
var value
|
||||||
var deferred = m.deferred()
|
var deferred = m.deferred()
|
||||||
deferred.promise.then(function(value) {return "foo"}).then(function(data) {value = data})
|
deferred.promise.then(function(data) {return "foo"}).then(function(data) {value = data})
|
||||||
deferred.resolve("test")
|
deferred.resolve("test")
|
||||||
return value === "foo"
|
return value === "foo"
|
||||||
})
|
})
|
||||||
|
|
@ -733,10 +739,17 @@ function testMithril(mock) {
|
||||||
test(function() {
|
test(function() {
|
||||||
var value
|
var value
|
||||||
var deferred = m.deferred()
|
var deferred = m.deferred()
|
||||||
deferred.promise.then(null, function(value) {return "foo"}).then(null, function(data) {value = data})
|
deferred.promise.then(null, function(data) {return "foo"}).then(null, function(data) {value = data})
|
||||||
deferred.reject("test")
|
deferred.reject("test")
|
||||||
return value === "foo"
|
return value === "foo"
|
||||||
})
|
})
|
||||||
|
test(function() {
|
||||||
|
var value1, value2
|
||||||
|
var deferred = m.deferred()
|
||||||
|
deferred.promise.then(function(data) {throw new Error}).then(function(data) {value1 = 1}, function(data) {value2 = data})
|
||||||
|
deferred.resolve("test")
|
||||||
|
return value1 === undefined && value2 instanceof Error
|
||||||
|
})
|
||||||
|
|
||||||
//m.sync
|
//m.sync
|
||||||
test(function() {
|
test(function() {
|
||||||
|
|
|
||||||
2
archive/v0.1.1/mithril.min.js
vendored
2
archive/v0.1.1/mithril.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
22
mithril.js
22
mithril.js
|
|
@ -307,14 +307,20 @@ new function(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
|
||||||
resolvers.push(function(value) {
|
function push(list, method, callback) {
|
||||||
var result = success(value)
|
list.push(function(value) {
|
||||||
next.resolve(result !== undefined ? result : value)
|
try {
|
||||||
})
|
var result = callback(value)
|
||||||
rejecters.push(function(value) {
|
next[method](result !== undefined ? result : value)
|
||||||
var result = error(value)
|
}
|
||||||
next.reject(result !== undefined ? result : value)
|
catch (e) {
|
||||||
})
|
if (e instanceof Error && e.constructor !== Error) throw e
|
||||||
|
else next.reject(e)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
push(resolvers, "resolve", success)
|
||||||
|
push(rejecters, "reject", error)
|
||||||
return next.promise
|
return next.promise
|
||||||
}
|
}
|
||||||
return object
|
return object
|
||||||
|
|
|
||||||
|
|
@ -214,7 +214,7 @@ function testMithril(mock) {
|
||||||
test(function() {
|
test(function() {
|
||||||
var value
|
var value
|
||||||
var deferred = m.deferred()
|
var deferred = m.deferred()
|
||||||
deferred.promise.then(function(value) {return "foo"}).then(function(data) {value = data})
|
deferred.promise.then(function(data) {return "foo"}).then(function(data) {value = data})
|
||||||
deferred.resolve("test")
|
deferred.resolve("test")
|
||||||
return value === "foo"
|
return value === "foo"
|
||||||
})
|
})
|
||||||
|
|
@ -228,10 +228,17 @@ function testMithril(mock) {
|
||||||
test(function() {
|
test(function() {
|
||||||
var value
|
var value
|
||||||
var deferred = m.deferred()
|
var deferred = m.deferred()
|
||||||
deferred.promise.then(null, function(value) {return "foo"}).then(null, function(data) {value = data})
|
deferred.promise.then(null, function(data) {return "foo"}).then(null, function(data) {value = data})
|
||||||
deferred.reject("test")
|
deferred.reject("test")
|
||||||
return value === "foo"
|
return value === "foo"
|
||||||
})
|
})
|
||||||
|
test(function() {
|
||||||
|
var value1, value2
|
||||||
|
var deferred = m.deferred()
|
||||||
|
deferred.promise.then(function(data) {throw new Error}).then(function(data) {value1 = 1}, function(data) {value2 = data})
|
||||||
|
deferred.resolve("test")
|
||||||
|
return value1 === undefined && value2 instanceof Error
|
||||||
|
})
|
||||||
|
|
||||||
//m.sync
|
//m.sync
|
||||||
test(function() {
|
test(function() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue