2016-09-19 3 views
5

私はAsynch.forEachSeriesを使って反復処理されている配列を持っています。イテレータの中でモデルを見つけて更新しました。更新が行われた後に2番目の項目を反復する必要があります。以下のコードを見つけてください。非同期メソッド、更新が起こったときにイテレータが起きるはずです

async.eachOfSeries(stockUpdate, function (valueSU, keySU, callbackSU) { 

    ProductVariations.findOne({id:valueSU.id}).exec(function (ePV,dPV){ 
     dPV.available_stock = parseInt(dPV.available_stock) - Qty; 
     dPV.save(function (errDPV) { 
      callbackSU(); // HERE ONCE, NEXT ITERATOR SHOULD BE CALLED 
     }); 
    }); 

}, function (err) { 
if (err) callback(err.message);      

}); 
+0

あなたのタスクを解決しなければならないので、あなただけが現在のもので終わったら、次の項目に移動したいですか? – qxz

+0

はい、ProductVariationモデルを更新した後、次のイテレータのみを実行する必要があります。 –

答えて

1

"ProductVariations ..."を約束してください。それが解決するまで待ってください。そして、次のイテレータを呼び出します。

このコードは

let promiseProductVariations = function (valueSU, keySU) { 
return new Promise(function (resolve, reject) { 
    ProductVariations.findOne({id:valueSU.id}).exec(function (ePV,dPV){ 
     dPV.available_stock = parseInt(dPV.available_stock) - Qty; 
     dPV.save(function (errDPV) { 
      if(errDPV){ 
       reject(errDPV); 
      }else{ 
       resolve(); // HERE ONCE, NEXT ITERATOR SHOULD BE CALLED 
      } 
     }); 
    }); 
})}; 

async.eachOfSeries(stockUpdate, function (valueSU, keySU, callbackSU) { 
    promiseProductVariations(valueSU, keySU) 
    .then(function() { 
     callbackSU(); 
    }) 
    .catch(function (error) { 
     if(error) 
      console.log(error); 
     //do thomething with error 
    }); 
}, function (err) { 
    if (err) callback(err.message); 
}); 
関連する問題