2017-04-04 1 views
1

このコードを実行するより良い方法があるかどうか調べたいと思います。私は2つのファイルを処理し、データベースに保存しようとしています。私はオーダー(親)を処理したいと思いますし、完了したら子レコードを処理しました。 DBがレコードをロックしている場合は、2秒待ってからもう一度やり直してください。 私はそれをこのように動作させましたが、私はそれをより良くする方法を知りたいと思います。 P.P.私は非同期を使用することはできません - 私は改善するために何ができる最高のモジュールパターンを作成することです非同期ループを保留して処理を続行します

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'関数は、コールバックを取るのではなく、約束を返すべきです。 – 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();

0

あなたコードの問題 - あなたが実装しているがasyncLoopそれはいくつかのライブラリを使用する方が良いです。

あなたは私が青い鳥好むhttps://github.com/caolan/asyncまたはhttp://bluebirdjs.com/docs/api

でそれを行うことができます。また、エラーを処理するためのより良い方法を提供します。

関連する問題