обратный звонок уже был вызван!в петле, в функции updateAll - PullRequest
0 голосов
/ 28 апреля 2019

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

Я получаю в обратном вызове уже называется!

Сцена в том, что я определил обратный вызов внутри цикла, и в первом цикле он вызывается на самом деле.

Я ищу способ, где

Я должен обновить весь список объектов в запросе MySQL плана вызова.

    Inward.updateIsActiveDetails = function(data, callback) {
        var id = _.map(data, 'id');
        if (id.length > 0) {
          _.forEach(id, id => {
            console.log('id....:', id)
            Inward.updateAll({id}, {
              isActive: 0,
            }).then(updateresult => {
              console.log(updateresult);
   // callback(error); showing err with it... (callback already called)
            }).catch(function(error) {
              callback(error);
            });
          });
        } else {
          callback(null, {
            success: true,
            msg: 'No records to update',
          });
        }
      };

вывод:

id....: 3
id....: 4
{ count: 1 }
{ count: 1 }

благодарен за правильное решение

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Обратный вызов должен вызываться один раз, вы вызываете его в цикле, поэтому он будет вызываться для каждой итерации цикла .Больше чем единожды.Следующее будет правильным, если по какой-либо причине вы не можете использовать async / await.

Inward.updateIsActiveDetails = function(data, callback) {
    var id = _.map(data, 'id');
    var len = id.length;
    var resultList = [];

    // When you call this function we add the results to our list
    // If the list of updates is equal to the number of updates we had to perform, call the callback.
    function updateResultList(updateResult) {
      resultList.push(updateResult);
      if (resultList.length === len) callback(resultList);
    }
    if (len > 0) {
      _.forEach(id, id => {
        Inward.updateAll({id}, {
          isActive: 0,
        })
        .then(updateResult);
      });
    } else {
      callback(null, {
        success: true,
        msg: 'No records to update',
      });
    }
  };

При асинхронном ожидании будет намного короче.

Inward.updateIsActiveDetails = async function(data) {
  const results = [];
  for(let i = 0; i < data.length; i++) {
    results.push(await Inward.updateById(data[i].id));
  }
  return results;
}
0 голосов
/ 01 мая 2019

Вот мой окончательный и рабочий ответ.

По сути, запрос updateAll выполняется один раз и будет выполняться как встроенный запрос

  id: {
        inq: _.map(data, 'id'),
      }

Итак, после запуска он обновит соответствующийтолько грести!очень интересно.

 Inward.updateIsActiveDetails = function (data, callback) {
    Inward.updateAll({
      id: {
        inq: _.map(data, 'id'),
      },
    }, {
        isActive: 0,
      }, function (error, resultDetails) {
        if (error) {
          console.log('error', error);
          callback(error);
        } else {
          console.log('resultDetails', resultDetails);
          callback(null, resultDetails);
        }
      });
  };
...