AsyncProcWait

by Jose Montero

JavaScript

var AsyncProc = (function(){
	return{
  	orderItems : [1, 2, 3],
    tries : 0,
    init : function()
    {
        this.saveOrder()
        .then(() => {
          console.log('Done Order')
          try
          {
            this.asyncLoop(this.orderItems.length, this.nextItem.bind(this), this.success)
           }
           catch(e) { console.log(e) }
        })
        .catch( console.log );    
    },
    saveOrder : function()
    {
    		return new Promise((resolve, reject) =>{
  				setTimeout(resolve, 2000, 'Save Order Done!')
  		})
    },
    nextItem : function(loop)
    {
      this.saveItems( loop.iteration() )
      .then((msg) => {
        console.log(loop.iteration())
        loop.next();
      })
      .catch((e) =>{
        console.log(e);
        this.tries = 1;
        this.waitNTryAgain().
        then(() => { console.log('Trying again!'); this.nextItem(loop); })
      })
    },
    waitNTryAgain : function()
    {
      return new Promise((resolve, reject) => {
        setTimeout( resolve, 2000, 'Done waiting')
      })
    },
    saveItems : function(itemNumber)
    {
      return new Promise((resolve, reject) =>{

          if (itemNumber == 1 && this.tries == 0)
          {
            setTimeout(reject, 4000, 'DbLockedException');
          }
          else
          {
            setTimeout(resolve, 4000, 'Save Item#: '+itemNumber+' Done!');
          } 
      });
    },    
    success : function()
    {
      console.log('Done asyncLoop!')
    },    
    asyncLoop : function(iterations, func, callback) 
    {
        var index = 0;
        var done = false;
        var loop = 
        {
          next: function() 
          {
            if (done) 	return;

            if (index < iterations) 
            {
              index++;
              func(loop);
            } 
            else 
            {
              done = true;
              callback();
            }
        },
        iteration: function() 
        {
           ...