JSFiddle - React, Tailwind, and code Playground

by Ulric Wilfred

JavaScript

var __s = Array.prototype.slice; 

function deferrable_as(ctx, f) {
  return function() {
    return (function(f, args) {
      return function(callback) { return f.apply(ctx, args.concat([callback])); };
    })(f, __s.call(arguments));
  }
}
      
var fs = { 'a': 20,
           'readFile': function(name, callback) {
                setTimeout(function() {
                  var err = null;
                  if (name === 'not_exist') err = new Error('Not exist');
                  callback(err, name);
                }, 2000);
                return 'unneeded';
             } };
      
var read_file = deferrable_as(fs, fs.readFile);

function successive(/*f...*/) {
  var as = __s.call(arguments),
      handle_err = as.slice(-1)[0];
  as[0](function(err, res) {
    if (err) { handle_err(err); return; };
    document.write('<span>Executed: '+res+'</span><br/>');
    successive.apply(null, as.slice(1));
  });
}

successive(read_file('one'),
           read_file('two'),
           read_file('three'),
           read_file('not_exist'),
           read_file('four'),
           function(e) { document.write('<span style="color:#f00">Error: '+e.message+'</span><br/>'); });