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')