2017-04-04 58 views
1

我想知道是否有更好的方法来执行此代码。我试图处理两个文件并保存在数据库中。我想处理订单(父),并在完成后处理子记录。如果数据库正在锁定一些记录,我等待2秒钟,然后重试。 我以这种方式工作,但我想知道如何让它变得更好。 P.S.我不能使用异步 - 等待暂停异步循环,然后继续处理

var orderItems = [1, 2, 3]; 
var tries = 0; 

saveOrder() 
.then(function() { 
    console.log('Done Order'); 
    try { 
    asyncLoop(orderItems.length, nextItem, success); 
    } 
    catch(e) { 
    console.log(e); 
    } 
}) 
.catch (console.log); 

function nextItem(loop) { 
    saveItems(loop.iteration()) 
    .then((msg) => { 
    console.log(loop.iteration()); 
    loop.next(); 
    }) 
    .catch((e) => { 
    if (e instanceof String) console.log('Catched !!'); 
    console.log(e); 
    tries = 1; 
    waitNTryAgain().then(() => { console.log('Trying again!'); nextItem(loop); }); 
    }); 
} 

function waitNTryAgain() { 
    return new Promise((resolve, reject) => { 
    setTimeout(resolve, 2000, 'Done waiting'); 
    }); 
} 

function success() { 
    console.log('Done asyncLoop!'); 
} 

function saveOrder() { 
    return new Promise((resolve, reject) => { 
    setTimeout(resolve, 2000, 'Save Order Done!'); 
    }); 
} 

function saveItems(itemNumber) { 
    return new Promise((resolve, reject) => {  
     if (itemNumber == 1 && tries == 0) { 
     setTimeout(reject, 4000, 'DbLockedException'); 
     } 
     else { 
     setTimeout(resolve, 4000, 'Save Item#: ' + itemNumber + ' Done!'); 
     }  
    }) 
} 

function asyncLoop(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() { 
       return index - 1; 
       },  
       break: function() { 
       done = true; 
       callback(); 
       } 
      }; 
    loop.next(); 
    return loop; 
} 
+0

听起来像一个更适合于[codereview.SE] – Bergi

+0

的问题。为什么不能使用'async' /'await'(如果需要的话用一个转译器)?你可以使用ES6发电机吗? – Bergi

+0

您的'asyncLoop'函数应该返回一个promise,而不是回调。 – Bergi

回答

0

我可以做些什么来改善是创建一个模块模式最好的:

var AsyncProc = (function(){ 
 
\t return{ 
 
    \t 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() 
 
    { 
 
    \t \t return new Promise((resolve, reject) =>{ 
 
    \t \t \t \t setTimeout(resolve, 2000, 'Save Order Done!') 
 
    \t \t }) 
 
    }, 
 
    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) \t return; 
 

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

 
     break: function() 
 
     { 
 
      done = true; 
 
      callback(); 
 
     } 
 
     }; 
 
     loop.next(); 
 
     return loop; 
 
    } \t  
 
    }; 
 

 
})(); 
 

 
AsyncProc.init();