JSFiddle - React, Tailwind, and code Playground

by Alexander Novikov

JavaScript 1.7

class Atol
{
	constructor(isEanbled) {
  	this.isEanbled = isEanbled;
  }
  
	create(options, resolve, reject) {
  	alert("Creating Atol");
    setTimeout(() => {
      this.isEanbled 
        ? resolve({ name: "Atol Device" })
        : reject();
    }, 2000);
  }
}

class ShtrihM
{
	constructor(isEanbled) {
  	this.isEanbled = isEanbled;
  }
  
	create(options, resolve, reject) {
  	alert("Creating Shtrih-M");
    setTimeout(() => {
      this.isEanbled
        ? resolve({ name: "Shtrih-M Device" })
        : reject();
    }, 2000);
  }
}

class Computer
{
	constructor(vendors) {
  	this.vendors = vendors;
  }
  
	create(options) {
  	this.vendors.reduce(
      (promise, vendor) => {
        return promise.then(
          (device) => { // stop and pass created device
            return Promise.resolve(device);
          },
          () => { // try to create with the next vendor
            return new Promise((resolve, reject) => {
              vendor.create(options, resolve, reject);
            });
          }
        );
      }, 
      Promise.reject() // we try next vendor after reject
    ).then(options.onDetected, options.onNotDetected);
  }
}

var computer = new Computer([
	new Atol(false),
  new ShtrihM(true)
]);
computer.create({
	onDetected: (device) => {
  	alert("Fiscal register has been detected: " + device.name);
  },
  onNotDetected: () => {
  	alert("Failed detecting fiscal register!");
  }
});