Как использовать Async AwAit для forEach с insertMany в диске узла - PullRequest
0 голосов
/ 21 февраля 2019

Любой может помочь мне с использованием async await .Это застряло у меня.Пожалуйста, помогите мне, это трудно понять с асинхронным и жду.Это ниже мой код.Я хочу, чтобы мой код работал в порядке.переменная ids - это массив, а tmpDoc - тоже массив документов для переноса цикла в массив, а затем я удаляю коллекцию в массиве $ в и после того, как я использую insertMany rawCollection для вставкимассив документов. Пожалуйста, смотрите мой код рекомендовать

let items = Inventories.find(
{
  itemId: itemId,
  tranDate: {
    $gt: tranDate,
  },
  branchId: branchId,
  warehouseId: warehouseId,
},
{
  sort: {
    tranDate: 1,
    createdAt: 1,
    // _id: 1,
  },
}
).fetch()
try {

  let ids = [],
  tmpDoc = []

  let tmpLastBalQty = balanceQty
  let tmpLastBalAmount = balanceAmount
  let tmpAvgCost = avgCost
_.forEach(items, async item => {     
   let condition = false
   if (
    item.refType === 'Cash_Sale' ||
    item.refType === 'Invoice' ||
    item.refType === 'Sale_Return' ||
    item.refType === 'Receipt_Refund'
   ) {
    item.cost = tmpAvgCost
    condition = true
   }       
  const balQty = _.round(tmpLastBalQty + item.qty, decimalNumber())
  let balAmount = _.round(
    tmpLastBalAmount + item.qty * item.cost,
    decimalNumber()
  )
  let avgCost = _.round(balAmount / balQty, decimalNumber())

  // Check balQty = 0
  if (balQty === 0) {
    balAmount = 0
    avgCost = item.cost
  }
  if (!_.isFinite(avgCost)) {
    avgCost = item.avgCost
  }

  let data = {
    _id: item._id,
    refType: item.refType,
    refId: item.refId,
    tranDate: item.tranDate,
    itemId: item.itemId,
    cost: condition ? avgCost : item.cost,
    price: item.price,
    qty: item.qty,
    balanceQty: balQty,
    avgCost: avgCost,
    balanceAmount: balAmount,
    warehouseId: item.warehouseId,
    branchId: item.branchId,
  }
  //
  ids.push(item._id)
  tmpDoc.push(data)
  //
  tmpAvgCost = avgCost
  tmpLastBalAmount = balAmount
  tmpLastBalQty = balQty


 })

  Inventories.remove({ _id: { $in: ids } })
  await Inventories.rawCollection().insertMany(tmpDoc)

  return 'success'
} catch (error) {
  console.log(error)
  throwError(error)
}

1 Ответ

0 голосов
/ 21 февраля 2019

Вы не можете использовать forEach.Просто используйте вместо этого for цикл, он будет работать так, как вы ожидаете.

См. Пример кода ниже:

myFunction = async items => {
  let data = [];
  for (let i = 0; i < items.length; i++) {
    await fetchItems(items[i]).then(response => {
      data.push(response)
    });
  }
  return data;
};
...