2017-07-27 69 views
0

我有async.each的问题,回调是在完成任务之前创建geting,我有下面的代码,得到输出为 调用reprice 7在调用reprice之前执行如图6所示,图6是我建立一个数组,我需要在async.each回调有async.each的问题,回调是在完成任务之前geting调用

called reprice : 
called reprice : 2 
called reprice : 3 
**called reprice : 7 []** 
no chnages has been made 
called reprice : 6 { status: 200, msg: 'recived optimal price 4 ', data: 17.75 } 
called reprice : 6 { status: 200, msg: 'recived optimal price 4 ', data: 20.99 } 

这部分是代码

async.forEach(records, function(result, callback) { 
    switch (result.Pricing) { 
     case "PF" : // current scenrio 
      var pfObject = _.filter(rules, {'sub_title': 'PF'}); 
      checkRepriceFrequency(result, pfObject[0], function (response) { 
       if (response.status === 200) { 
        // call check inventory rules 
        CheckInventoryRules(result, pfObject[0], function (response) { 
         console.log('called reprice : 6 ',response); 
         if (response.status === 200) { 
          var price = result.sales_price; 
          var pushData = { 
           price: price, 
           optimalPrice: response.data, 
           SKU: result.SKU, 
           _id: result._id, 
           frequency: pfObject[0].reprice_frequency 
          }; 
          productArray.push(pushData); 
         } 
        }); 
       } else { 
        console.log('err'); 
       } 
      }); 
     } 
     callback(null); 
    }, function(err) { 
     console.log('called reprice : 7 ',productArray); 
    if (!err) { 
     if (productArray.length > 0) { 
      console.log('To update Synch : ',productArray); 
     } else { 
      console.log("no chnages has been made "); 
     } 
    } 
}); 
+0

嗨任何人都可以帮我吗? –

回答

1

呀。所以你实施async.each有点不对。请参阅async.each确保每个对象都经过循环但不确保同步执行。在你的例子中,你调用了CheckInventoryRules这似乎是做了一个AJAX调用。

但检查,你呼吁在函数结束回调(它不会等待AJAX​​来完成)。这意味着在完成AJAX调用之前,回调可能被称为指示该特定对象的处理已完成。

要修复它,您需要检查是否正在调用AJAX调用,需要在productArray.push(pushData);之后调用callback(null)

一般情况下,调用只有当任务已经执行完毕后callback

+0

谢谢@ kawadhiya21,对这个问题,但如果我把productArray.push(pushData)后回调(NULL); ,则回调先推第一个匹配 –

0

您已经实现async.forEach完全错误的。 See this

在交换机中似乎有一个异步调用,因此您必须在该异步调用中调用callback(null)

async.forEach(records, function(result, callback) { 
    switch (result.Pricing) { 
     case "PF" : 
      var pfObject = _.filter(rules, {'sub_title': 'PF'}); 
      checkRepriceFrequency(result, pfObject[0], function (response) { 
       if (response.status === 200) { 
        CheckInventoryRules(result, pfObject[0], function (response) { 
         console.log('called reprice : 6 ',response); 
         if (response.status === 200) { 
          var price = result.sales_price; 
          var pushData = { 
           price: price, 
           optimalPrice: response.data, 
           SKU: result.SKU, 
           _id: result._id, 
           frequency: pfObject[0].reprice_frequency 
          }; 
          productArray.push(pushData); 
          callback(null); 
         } 
        //handle callback on else otherwise final callback will not get the event. 
        }); 
       } else { 
/* 
        callback(null); 
        Or 
        callback(Someerror); 
*/ 
        console.log('err'); 
       } 
      }); 
      break; 
     default: 
      callback(null); 
     // return false; 


     //break; 


    } 


}, function(err) { 
    console.log('called reprice : 7 ',productArray); 
    if (!err) { 
     if (productArray.length > 0) { 
      console.log('To update Synch : ',productArray); 

     } else { 
      console.log("no chnages has been made "); 
     } 
    } 
}); 
+0

后让呼叫谢谢@vkstack我tryed像这一点,但回调与“PF”的第一场比赛执行, –

+0

这是一个惯例把默认总是在你的交换机statement.But选择永远是你的。 – vkstack

相关问题