refactor promises
This commit is contained in:
parent
2537bded27
commit
be7718213f
1 changed files with 20 additions and 34 deletions
54
mithril.js
54
mithril.js
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue