Publish and Subscribe and Promises - resolve_when
HTML
<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.1.0/knockout-min.js"></script>
<h1>Resolved_when</h1>
<ul id='list'></ul>
JavaScript 1.7
var resolve_when = (obs, test) => {
if (!test) {
test = function (t) { return Boolean(t) }
}
if (test(obs())) { return Promise.resolve(obs); }
return new Promise(function (resolve) {
var subs = obs.subscribe(function(v) {
if (test(v)) {
resolve(obs);
subs.dispose();
}
});
});
}
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')