Обновление многих строк с помощью sequelize внутри цикла - PullRequest
2 голосов
/ 23 января 2020

У меня есть массив данных из полезной нагрузки, и я хотел бы l oop через данные и обновить их в базе данных, после того, как все данные были обновлены, я хочу обновить данные кэша, которые я получаю от redis

Полезная нагрузка

"data": [
    {
        "surveyFieldId": 384471,
        "answer": "new answer"
    },
    {
        "surveyFieldId": 384472,
        "answer": "new answer"
    }
]

Метод обновления

async updateDataSurveyField (dataSurveyId, { surveyFieldId, answer, needRevision }) {
let params = {
  answer
};

let DataSurveyField = await this.db.DataSurveyField.update(params, {
  where: {
    dataSurveyId,
    surveyFieldId
  }
});

return DataSurveyField;

}

L oop и кэш обновлений

if (data) {
      for (let index = 0; index < data.length; index++) {
        await this.updateDataSurveyField(object.id, data[index], method);
      }
    }

await updateCacheReport({
        db: this.db,
        key: report.uuid
      });

Метод updateCache снова запрашивает данные из базы данных и вставляет их в redis.

Моя проблема заключается в том, что метод updateCache был запущен, когда обновление l oop еще не завершено, поэтому, если я отправляю 5 ответов, только 2 или 3 данных были обновлены в кеше. Есть ли способ, которым я могу убедиться, что весь ответ сначала обновляется, а затем обновлять кэш?

Спасибо.

1 Ответ

0 голосов
/ 23 января 2020

Вам нужно принудительно ожидать всех асин c вызовов. Что-то вроде:

Promise.all(
    data.map(
        item => this.updateDataSurveyField(object.id, data[index], method)
    )
).then(surveyFields => {
  await updateCacheReport({
        db: this.db,
        key: report.uuid
      });
})

См. Как сделать обещание. Все ждут вложенного обещания. Все? , чтобы почувствовать образец Обещания.

...