Как использовать серию асинхронных карт в nodejs? - PullRequest
1 голос
/ 05 ноября 2019

Я использую серию асинхронных карт для манипулирования массивом.

exports.MultiChannelInvoke = async function (bulkUploadArray) {
  async.mapSeries(bulkUploadArray, async function (array, cb) {
    let ap = array[0]
    let apArray = ['PL', 'A', 'J', 'V', 'I'];

    if (!apArray.includes(ap)) {  // For Array's first value it is KL & it is getting inside this loop
      //some manipulation
    }
    else {
      //some manipulation
    }
  }, (err, results) => {
    if (err) {
      masterResult = { message: 'Failed During async Map', errorMessage: err }

    } else {
      let mongoData = batch;
      uploadsummary.create(mongoData)
      masterResult = { FinalResults: results }

    }
  })

  return masterResult
}

Мой массив для массовой загрузки будет выглядеть следующим образом:

[
  [
    "KL",
    {
      "ms": "2147766904",
      "desc": "APP-LIC JEEVAN POLICY,7878787878,30/01/19",
      "ur": "DNDSER6911744",
      "tap": "TA",
      "tapupdate": [ "Array" ]
    }
  ],
  [
    'PL',
    {
      ms: '3147766904',
      desc: 'APP-LIC JEEVAN POLICY,9916957781,30/01/19',
      ur: 'DNDSER6911745',
      tap: 'TA',
      tapupdate: [ Array ]
    }
  ]
]

Так, в соответствии с моим массивом для массовой загрузки первое значение равно KL, и оно попадает в первый цикл if. (Который у меня естьупоминается в комментариях в коде). Таким образом, после того, как мы проникли внутрь и сделали манипуляции, он не учитывает значение второго массива. После окончания манипуляции для первого значения, он напрямую возвращает результат. Кто-нибудь может сказать мне, что я делаю не так? Или я не должен использовать серию асинхронных карт. Пожалуйста, предложите мне.

1 Ответ

0 голосов
/ 05 ноября 2019

Во-первых, создание функции async-await автоматически не возвращает значение ПОСЛЕ того, как все обработано. return masterResult будет выполнено до async.mapSeries, вам нужно дать обещание и вернуть его.

Кроме того, если вы используете async-await внутри async.js, вам необходимо вернуть данные из асинхронной функции вбудет рассматриваться как результат.

Вот версия, включающая то, что я сказал выше:

const MultiChannelInvoke = function (bulkUploadArray) {
  return new Promise((res, rej) => { //make promise
    async.mapSeries(bulkUploadArray, async function (array) { //no cb required
      let ap = array[0]
      let apArray = ['PL', 'A', 'J', 'V', 'I'];

      if (!apArray.includes(ap)) {  // For Array's first value it is KL & it is getting inside this loop
        return 'IF!'
      }
      else {
        return 'ELSE';
      }
    }, (err, results) => {
      if (err) {
        rej({ message: 'Failed During async Map', errorMessage: err }); //reject
      } else {
        res(results); //resolve
      }
    })
  })
}


MultiChannelInvoke([['KL',
  {
    ms: '2147766904',
    desc: 'APP-LIC JEEVAN POLICY,7878787878,30/01/19',
    ur: 'DNDSER6911744',
    tap: 'TA',
    tapupdate: [Array]
  }],
['PL',
  {
    ms: '3147766904',
    desc: 'APP-LIC JEEVAN POLICY,9916957781,30/01/19',
    ur: 'DNDSER6911745',
    tap: 'TA',
    tapupdate: [Array]
  }]]).then(console.dir);

Вывод:
[ 'IF!', 'ELSE' ]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...