Fluent Async Interface - v3
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);
}
function omit(obj, propertiesToRemove) {
const target = obj;
for (const property of propertiesToRemove) {
delete target[property];
}
return target;
}
class MyApi {
constructor() {
this._promise = Promise.resolve();
}
_wrap(genPromiseCallback, propertiesToRemove) {
this._promise = this._promise.then(() => genPromiseCallback());
if (propertiesToRemove) {
if (propertiesToRemove.length === 0) {
return this._promise;
}
return omit(this, propertiesToRemove);
}
return this;
}
init() {
return this._wrap(() => {
return promiseTimeout()
.then(() => log('init done'));
}, ['init']);
}
add(value) {
return this._wrap(() => {
return promiseTimeout()
.then(() => log(`add done for ${value}`));
}, ['init']);
}
remove(value) {
return this._wrap(() => {
return promiseTimeout()
.then(() => log(`remove done for ${value}`));
}, ['init']);
}
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);