move Deferred constructor out of m.deferred
This commit is contained in:
parent
f832b67585
commit
bf288b09c5
1 changed files with 127 additions and 129 deletions
256
mithril.js
256
mithril.js
|
|
@ -563,7 +563,6 @@ Mithril = m = new function app(window, undefined) {
|
||||||
cellCache[cacheKey] = undefined
|
cellCache[cacheKey] = undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
var none = {}
|
|
||||||
function newPromisedProp(prop, promise) {
|
function newPromisedProp(prop, promise) {
|
||||||
prop.then = function () {
|
prop.then = function () {
|
||||||
var newProp = m.prop()
|
var newProp = m.prop()
|
||||||
|
|
@ -584,136 +583,135 @@ Mithril = m = new function app(window, undefined) {
|
||||||
return prop
|
return prop
|
||||||
}
|
}
|
||||||
m.deferred = function () {
|
m.deferred = function () {
|
||||||
|
|
||||||
// Promiz.mithril.js | Zolmeister | MIT
|
|
||||||
function Deferred(fn, er) {
|
|
||||||
// states
|
|
||||||
// 0: pending
|
|
||||||
// 1: resolving
|
|
||||||
// 2: rejecting
|
|
||||||
// 3: resolved
|
|
||||||
// 4: rejected
|
|
||||||
var self = this,
|
|
||||||
state = 0,
|
|
||||||
val = 0,
|
|
||||||
next = [];
|
|
||||||
|
|
||||||
self['promise'] = self
|
|
||||||
|
|
||||||
self['resolve'] = function (v) {
|
|
||||||
if (!state) {
|
|
||||||
val = v
|
|
||||||
state = 1
|
|
||||||
|
|
||||||
fire()
|
|
||||||
}
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
self['reject'] = function (v) {
|
|
||||||
if (!state) {
|
|
||||||
val = v
|
|
||||||
state = 2
|
|
||||||
|
|
||||||
fire()
|
|
||||||
}
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
self['then'] = function (fn, er) {
|
|
||||||
var d = new Deferred(fn, er)
|
|
||||||
if (state == 3) {
|
|
||||||
d.resolve(val)
|
|
||||||
}
|
|
||||||
else if (state == 4) {
|
|
||||||
d.reject(val)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
next.push(d)
|
|
||||||
}
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
var finish = function (type) {
|
|
||||||
state = type || 4
|
|
||||||
next.map(function (p) {
|
|
||||||
state == 3 && p.resolve(val) || p.reject(val)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// ref : reference to 'then' function
|
|
||||||
// cb, ec, cn : successCallback, failureCallback, notThennableCallback
|
|
||||||
function thennable (ref, cb, ec, cn) {
|
|
||||||
if ((typeof val == 'object' || typeof val == 'function') && typeof ref == 'function') {
|
|
||||||
try {
|
|
||||||
|
|
||||||
// cnt protects against abuse calls from spec checker
|
|
||||||
var cnt = 0
|
|
||||||
ref.call(val, function (v) {
|
|
||||||
if (cnt++) return
|
|
||||||
val = v
|
|
||||||
cb()
|
|
||||||
}, function (v) {
|
|
||||||
if (cnt++) return
|
|
||||||
val = v
|
|
||||||
ec()
|
|
||||||
})
|
|
||||||
} catch (e) {
|
|
||||||
val = e
|
|
||||||
ec()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cn()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function fire() {
|
|
||||||
|
|
||||||
// check if it's a thenable
|
|
||||||
var ref;
|
|
||||||
try {
|
|
||||||
ref = val && val.then
|
|
||||||
} catch (e) {
|
|
||||||
val = e
|
|
||||||
state = 2
|
|
||||||
return fire()
|
|
||||||
}
|
|
||||||
thennable(ref, function () {
|
|
||||||
state = 1
|
|
||||||
fire()
|
|
||||||
}, function () {
|
|
||||||
state = 2
|
|
||||||
fire()
|
|
||||||
}, function () {
|
|
||||||
try {
|
|
||||||
if (state == 1 && typeof fn == 'function') {
|
|
||||||
val = fn(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (state == 2 && typeof er == 'function') {
|
|
||||||
val = er(val)
|
|
||||||
state = 1
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
val = e
|
|
||||||
return finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (val == self) {
|
|
||||||
val = TypeError()
|
|
||||||
finish()
|
|
||||||
} else thennable(ref, function () {
|
|
||||||
finish(3)
|
|
||||||
}, finish, function () {
|
|
||||||
finish(state == 1 && 3)
|
|
||||||
})
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return newPromisedProp(m.prop(), new Deferred())
|
return newPromisedProp(m.prop(), new Deferred())
|
||||||
}
|
}
|
||||||
|
// Promiz.mithril.js | Zolmeister | MIT
|
||||||
|
function Deferred(fn, er) {
|
||||||
|
// states
|
||||||
|
// 0: pending
|
||||||
|
// 1: resolving
|
||||||
|
// 2: rejecting
|
||||||
|
// 3: resolved
|
||||||
|
// 4: rejected
|
||||||
|
var self = this,
|
||||||
|
state = 0,
|
||||||
|
val = 0,
|
||||||
|
next = [];
|
||||||
|
|
||||||
|
self['promise'] = self
|
||||||
|
|
||||||
|
self['resolve'] = function (v) {
|
||||||
|
if (!state) {
|
||||||
|
val = v
|
||||||
|
state = 1
|
||||||
|
|
||||||
|
fire()
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
self['reject'] = function (v) {
|
||||||
|
if (!state) {
|
||||||
|
val = v
|
||||||
|
state = 2
|
||||||
|
|
||||||
|
fire()
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
self['then'] = function (fn, er) {
|
||||||
|
var d = new Deferred(fn, er)
|
||||||
|
if (state == 3) {
|
||||||
|
d.resolve(val)
|
||||||
|
}
|
||||||
|
else if (state == 4) {
|
||||||
|
d.reject(val)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
next.push(d)
|
||||||
|
}
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
|
||||||
|
var finish = function (type) {
|
||||||
|
state = type || 4
|
||||||
|
next.map(function (p) {
|
||||||
|
state == 3 && p.resolve(val) || p.reject(val)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ref : reference to 'then' function
|
||||||
|
// cb, ec, cn : successCallback, failureCallback, notThennableCallback
|
||||||
|
function thennable (ref, cb, ec, cn) {
|
||||||
|
if ((typeof val == 'object' || typeof val == 'function') && typeof ref == 'function') {
|
||||||
|
try {
|
||||||
|
|
||||||
|
// cnt protects against abuse calls from spec checker
|
||||||
|
var cnt = 0
|
||||||
|
ref.call(val, function (v) {
|
||||||
|
if (cnt++) return
|
||||||
|
val = v
|
||||||
|
cb()
|
||||||
|
}, function (v) {
|
||||||
|
if (cnt++) return
|
||||||
|
val = v
|
||||||
|
ec()
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
val = e
|
||||||
|
ec()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cn()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function fire() {
|
||||||
|
|
||||||
|
// check if it's a thenable
|
||||||
|
var ref;
|
||||||
|
try {
|
||||||
|
ref = val && val.then
|
||||||
|
} catch (e) {
|
||||||
|
val = e
|
||||||
|
state = 2
|
||||||
|
return fire()
|
||||||
|
}
|
||||||
|
thennable(ref, function () {
|
||||||
|
state = 1
|
||||||
|
fire()
|
||||||
|
}, function () {
|
||||||
|
state = 2
|
||||||
|
fire()
|
||||||
|
}, function () {
|
||||||
|
try {
|
||||||
|
if (state == 1 && typeof fn == 'function') {
|
||||||
|
val = fn(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (state == 2 && typeof er == 'function') {
|
||||||
|
val = er(val)
|
||||||
|
state = 1
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
val = e
|
||||||
|
return finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val == self) {
|
||||||
|
val = TypeError()
|
||||||
|
finish()
|
||||||
|
} else thennable(ref, function () {
|
||||||
|
finish(3)
|
||||||
|
}, finish, function () {
|
||||||
|
finish(state == 1 && 3)
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m.sync = function(args) {
|
m.sync = function(args) {
|
||||||
var method = "resolve"
|
var method = "resolve"
|
||||||
function synchronizer(pos, resolved) {
|
function synchronizer(pos, resolved) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue