Fluent Async Interface - v2
by Julien Roche
HTML
<ol></ol>
JavaScript 1.7
const olElement = document.querySelector('ol');
function promiseTimeout() {
return new Promise((resolve) => {
setTimeout(resolve, 500 + Math.round(Math.random() * 1000));
});
}
function log(msg) {
const liElement = document.createElement('li');
liElement.textContent = msg;
olElement.appendChild(liElement);
}
class MyApi {
constructor() {
this._promise = Promise.resolve();
}
_wrap(genPromiseCallback) {
this._promise = this._promise.then(() => genPromiseCallback());
return this;
}
init() {
return this._wrap(() => {
return promiseTimeout()
.then(() => log('init done'));
});
}
add(value) {
return this._wrap(() => {
return promiseTimeout()
.then(() => log(`add done for ${value}`));
});
}
remove(value) {
return this._wrap(() => {
return promiseTimeout()
.then(() => log(`remove done for ${value}`));
});
}
destroy() {
return this._wrap(() => {
return promiseTimeout()
.then(() => log('destroy done'));
});
}
}
setTimeout(() => {
const myApi = new MyApi();
myApi
.init()
.add(42)
.add(55)
.remove(42)
.destroy()
.catch((err) => alert(`Error: ${err}`))
;
}, 1000);