promise props resolve to promises instead of blank prop functions
This commit is contained in:
parent
6b62681da8
commit
d567de08a8
3 changed files with 88 additions and 112 deletions
|
|
@ -361,33 +361,31 @@ Mithril = m = new function app(window, undefined) {
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
m.prop = function(store) {
|
function _prop(store) {
|
||||||
function isPromise(obj) {
|
|
||||||
return typeof store === 'object' && typeof store.then === 'function'
|
|
||||||
}
|
|
||||||
|
|
||||||
var prop = function() {
|
var prop = function() {
|
||||||
if (arguments.length) {
|
if (arguments.length) store = arguments[0]
|
||||||
store = arguments[0]
|
return store
|
||||||
if (isPromise(store)) {
|
|
||||||
store.then(prop)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return isPromise(store) ? undefined : store
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prop.toJSON = function() {
|
prop.toJSON = function() {
|
||||||
return isPromise(store) ? undefined : store
|
return store
|
||||||
}
|
|
||||||
|
|
||||||
if (isPromise(store)) {
|
|
||||||
store.then(prop)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return prop
|
return prop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m.prop = function (store) {
|
||||||
|
if ((typeof store === 'object' || typeof store === 'function') &&
|
||||||
|
typeof store.then === 'function') {
|
||||||
|
var prop = _prop()
|
||||||
|
newPromisedProp(prop, store).then(prop)
|
||||||
|
|
||||||
|
return prop
|
||||||
|
}
|
||||||
|
|
||||||
|
return _prop(store)
|
||||||
|
}
|
||||||
|
|
||||||
var roots = [], modules = [], controllers = [], lastRedrawId = 0, computePostRedrawHook = null, prevented = false
|
var roots = [], modules = [], controllers = [], lastRedrawId = 0, computePostRedrawHook = null, prevented = false
|
||||||
m.module = function(root, module) {
|
m.module = function(root, module) {
|
||||||
var index = roots.indexOf(root)
|
var index = roots.indexOf(root)
|
||||||
|
|
@ -566,6 +564,25 @@ Mithril = m = new function app(window, undefined) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var none = {}
|
var none = {}
|
||||||
|
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
|
||||||
|
}
|
||||||
m.deferred = function () {
|
m.deferred = function () {
|
||||||
|
|
||||||
// Promiz.mithril.js | Zolmeister | MIT
|
// Promiz.mithril.js | Zolmeister | MIT
|
||||||
|
|
@ -695,26 +712,6 @@ Mithril = m = new function app(window, undefined) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function newPromisedProp(prop, promise) {
|
|
||||||
prop.then = function () {
|
|
||||||
var newProp = m.prop(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
|
|
||||||
}
|
|
||||||
|
|
||||||
return newPromisedProp(m.prop(), new Deferred())
|
return newPromisedProp(m.prop(), new Deferred())
|
||||||
}
|
}
|
||||||
m.sync = function(args) {
|
m.sync = function(args) {
|
||||||
|
|
@ -2414,29 +2411,20 @@ function testMithril(mock) {
|
||||||
return JSON.stringify(obj) === '{"prop":"test"}'
|
return JSON.stringify(obj) === '{"prop":"test"}'
|
||||||
})
|
})
|
||||||
test(function() {
|
test(function() {
|
||||||
var prop = m.prop({
|
var defer = m.deferred()
|
||||||
then: function(cb) {cb("test")}
|
var prop = m.prop(defer.promise)
|
||||||
})
|
defer.resolve("test")
|
||||||
|
|
||||||
return prop() === "test"
|
return prop() === "test"
|
||||||
})
|
})
|
||||||
test(function() {
|
test(function() {
|
||||||
var prop = m.prop({
|
var defer = m.deferred()
|
||||||
then: function() {}
|
var prop = m.prop(defer.promise).then(function () {
|
||||||
|
return "test2"
|
||||||
})
|
})
|
||||||
|
defer.resolve("test")
|
||||||
|
|
||||||
return prop() === undefined
|
return prop() === "test2"
|
||||||
})
|
|
||||||
test(function() {
|
|
||||||
var promise = {
|
|
||||||
then: function(cb) {this.cb = cb},
|
|
||||||
resolve: function (x) {
|
|
||||||
this.cb(x)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var prop = m.prop(promise)
|
|
||||||
promise.resolve("test")
|
|
||||||
|
|
||||||
return prop() === "test"
|
|
||||||
})
|
})
|
||||||
|
|
||||||
//m.request
|
//m.request
|
||||||
|
|
|
||||||
73
mithril.js
73
mithril.js
|
|
@ -361,33 +361,31 @@ Mithril = m = new function app(window, undefined) {
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
m.prop = function(store) {
|
function _prop(store) {
|
||||||
function isPromise(obj) {
|
|
||||||
return typeof store === 'object' && typeof store.then === 'function'
|
|
||||||
}
|
|
||||||
|
|
||||||
var prop = function() {
|
var prop = function() {
|
||||||
if (arguments.length) {
|
if (arguments.length) store = arguments[0]
|
||||||
store = arguments[0]
|
return store
|
||||||
if (isPromise(store)) {
|
|
||||||
store.then(prop)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return isPromise(store) ? undefined : store
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prop.toJSON = function() {
|
prop.toJSON = function() {
|
||||||
return isPromise(store) ? undefined : store
|
return store
|
||||||
}
|
|
||||||
|
|
||||||
if (isPromise(store)) {
|
|
||||||
store.then(prop)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return prop
|
return prop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m.prop = function (store) {
|
||||||
|
if ((typeof store === 'object' || typeof store === 'function') &&
|
||||||
|
typeof store.then === 'function') {
|
||||||
|
var prop = _prop()
|
||||||
|
newPromisedProp(prop, store).then(prop)
|
||||||
|
|
||||||
|
return prop
|
||||||
|
}
|
||||||
|
|
||||||
|
return _prop(store)
|
||||||
|
}
|
||||||
|
|
||||||
var roots = [], modules = [], controllers = [], lastRedrawId = 0, computePostRedrawHook = null, prevented = false
|
var roots = [], modules = [], controllers = [], lastRedrawId = 0, computePostRedrawHook = null, prevented = false
|
||||||
m.module = function(root, module) {
|
m.module = function(root, module) {
|
||||||
var index = roots.indexOf(root)
|
var index = roots.indexOf(root)
|
||||||
|
|
@ -566,6 +564,25 @@ Mithril = m = new function app(window, undefined) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var none = {}
|
var none = {}
|
||||||
|
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
|
||||||
|
}
|
||||||
m.deferred = function () {
|
m.deferred = function () {
|
||||||
|
|
||||||
// Promiz.mithril.js | Zolmeister | MIT
|
// Promiz.mithril.js | Zolmeister | MIT
|
||||||
|
|
@ -695,26 +712,6 @@ Mithril = m = new function app(window, undefined) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function newPromisedProp(prop, promise) {
|
|
||||||
prop.then = function () {
|
|
||||||
var newProp = m.prop(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
|
|
||||||
}
|
|
||||||
|
|
||||||
return newPromisedProp(m.prop(), new Deferred())
|
return newPromisedProp(m.prop(), new Deferred())
|
||||||
}
|
}
|
||||||
m.sync = function(args) {
|
m.sync = function(args) {
|
||||||
|
|
|
||||||
|
|
@ -1414,29 +1414,20 @@ function testMithril(mock) {
|
||||||
return JSON.stringify(obj) === '{"prop":"test"}'
|
return JSON.stringify(obj) === '{"prop":"test"}'
|
||||||
})
|
})
|
||||||
test(function() {
|
test(function() {
|
||||||
var prop = m.prop({
|
var defer = m.deferred()
|
||||||
then: function(cb) {cb("test")}
|
var prop = m.prop(defer.promise)
|
||||||
})
|
defer.resolve("test")
|
||||||
|
|
||||||
return prop() === "test"
|
return prop() === "test"
|
||||||
})
|
})
|
||||||
test(function() {
|
test(function() {
|
||||||
var prop = m.prop({
|
var defer = m.deferred()
|
||||||
then: function() {}
|
var prop = m.prop(defer.promise).then(function () {
|
||||||
|
return "test2"
|
||||||
})
|
})
|
||||||
|
defer.resolve("test")
|
||||||
|
|
||||||
return prop() === undefined
|
return prop() === "test2"
|
||||||
})
|
|
||||||
test(function() {
|
|
||||||
var promise = {
|
|
||||||
then: function(cb) {this.cb = cb},
|
|
||||||
resolve: function (x) {
|
|
||||||
this.cb(x)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var prop = m.prop(promise)
|
|
||||||
promise.resolve("test")
|
|
||||||
|
|
||||||
return prop() === "test"
|
|
||||||
})
|
})
|
||||||
|
|
||||||
//m.request
|
//m.request
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue