refactor promises

This commit is contained in:
Leo Horie 2014-09-14 23:18:39 -04:00
parent 2537bded27
commit be7718213f

View file

@ -429,10 +429,7 @@ Mithril = m = new function app(window, undefined) {
m.prop = function(store) { m.prop = function(store) {
if ((typeof store == "object" || typeof store == "function") && store !== null && typeof store.then == "function") { if ((typeof store == "object" || typeof store == "function") && store !== null && typeof store.then == "function") {
var prop = gettersetter() return propify(store)
newPromisedProp(prop, store).then(prop)
return prop
} }
return gettersetter(store) return gettersetter(store)
@ -618,15 +615,23 @@ Mithril = m = new function app(window, undefined) {
} }
m.deferred = function () { m.deferred = function () {
var resolve, reject, executor = function(a, b) { var deferred = {}, resolve, reject
resolve = a, reject = b deferred.promise = propify(new Promise(function(a, b) {deferred.resolve = a, deferred.reject = b}))
} return deferred
return newPromisedProp(m.prop(), new m.deferred.constructor(executor))
} }
m.deferred.constructor = function(executor) { function propify(promise) {
prop = m.prop()
promise.then(prop)
prop.then = function(resolve, reject) {
return propify(promise.then(resolve, reject))
}
return prop
}
function Promise(executor) {
var deferred = new Deferred() var deferred = new Deferred()
executor(deferred.resolve, deferred.reject) executor(deferred.resolve, deferred.reject)
return deferred return deferred.promise
} }
//Promiz.mithril.js | Zolmeister | MIT //Promiz.mithril.js | Zolmeister | MIT
//a modified version of Promiz.js, which does not conform to Promises/A+ for two reasons: //a modified version of Promiz.js, which does not conform to Promises/A+ for two reasons:
@ -636,7 +641,7 @@ Mithril = m = new function app(window, undefined) {
var RESOLVING = 1, REJECTING = 2, RESOLVED = 3, REJECTED = 4 var RESOLVING = 1, REJECTING = 2, RESOLVED = 3, REJECTED = 4
var self = this, state = 0, promiseValue = 0, next = [] var self = this, state = 0, promiseValue = 0, next = []
self["promise"] = self self["promise"] = m.prop()
self["resolve"] = function(value) { self["resolve"] = function(value) {
if (!state) { if (!state) {
@ -658,7 +663,7 @@ Mithril = m = new function app(window, undefined) {
return this return this
} }
self["then"] = function(successCallback, failureCallback) { self.promise["then"] = function(successCallback, failureCallback) {
var deferred = new Deferred(successCallback, failureCallback) var deferred = new Deferred(successCallback, failureCallback)
if (state == RESOLVED) { if (state == RESOLVED) {
deferred.resolve(promiseValue) deferred.resolve(promiseValue)
@ -669,13 +674,13 @@ Mithril = m = new function app(window, undefined) {
else { else {
next.push(deferred) next.push(deferred)
} }
return deferred return deferred.promise
} }
function finish(type) { function finish(type) {
state = type || REJECTED state = type || REJECTED
next.map(function (p) { next.map(function(deferred) {
state == RESOLVED && p.resolve(promiseValue) || p.reject(promiseValue) state == RESOLVED && deferred.resolve(promiseValue) || deferred.reject(promiseValue)
}) })
} }
@ -752,25 +757,6 @@ Mithril = m = new function app(window, undefined) {
}) })
} }
} }
function newPromisedProp(prop, promise) {
prop.then = function () {
var newProp = m.prop()
return newPromisedProp(newProp,
promise.then.apply(promise, arguments).then(newProp))
}
prop.promise = prop
prop.resolve = function (val) {
prop(val)
promise = promise.resolve.apply(promise, arguments)
return prop
}
prop.reject = function () {
promise = promise.reject.apply(promise, arguments)
return prop
}
return prop
}
function rethrowUnchecked(e) { function rethrowUnchecked(e) {
if (type.call(e) == "[object Error]" && !e.constructor.toString().match(/ Error/)) throw e if (type.call(e) == "[object Error]" && !e.constructor.toString().match(/ Error/)) throw e
} }