Publish and Subscribe and Promises - resolve_when
by bmh_ca
HTML
<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.1.0/knockout-min.js"></script>
<h1>Resolved_when</h1>
<ul id='list'></ul>
CoffeeScript
resolve_when = (obs, test) ->
test or= (t) -> Boolean(t)
if test(obs())
p = Promise.resolve(obs)
else
p = new Promise((resolve) ->
subs = obs.subscribe (v) ->
return unless test(v)
resolve(obs)
subs.dispose()
)
return p
obs = ko.observable()
# Arbitrary test
resolve_when(obs, (v) -> v == 'xyz')
.then((ov) -> $("#list").append("<li>obs meets arbitrary test: #{ko.unwrap(ov)}</li>"))
# Before obs is set
resolve_when(obs)
.then((ov) -> $("#list").append("<li>before obs is set: #{ko.unwrap(ov)}</li>"))
# Set obs.
obs('Published!')
# After obs is set
resolve_when(obs)
.then((ov) -> $("#list").append("<li>after obs is set: #{ko.unwrap(ov)}</li>"))
# Set obs to satisfy our arbitrary test.
obs('xyz')