异步方法,Iterator应该在更新发生时发生

时间:2016-09-19 20:17:35

标签: node.js sails.js

我有一个使用Asynch.forEachSeries迭代的数组。在迭代器内部,我找到了模型并进行了更新。我需要在更新发生后迭代第二个项目。找到下面的代码。

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);                     

});

1 个答案:

答案 0 :(得分:1)

我认为你应该包装" ProductVariations ......"在承诺。等待,直到它结算。然后调用next iterator。

此代码必须解决您的任务

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);
});