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