Функция async / Await не ожидает
Здесь я пытаюсь создать функцию, которая извлекает некоторые данные из базы данных с помощью шаблона MVC.
Посмотреть
getQuestionsData (treatmentId) {
console.log(1)
controller.getTreatmentQuestions(treatmentId)
.then(questions => {
console.log(10)
this.questions = questions // variable is updated
})
},
Контроллер
getTreatmentQuestions: async (treatmentTypeId) => {
console.log(2)
// first data fetch from db
const questions = await model.getQuestion(treatmentTypeId)
console.log(3)
// iterate over each result record
questions.map(async question => {
console.log(4)
if (question.answerType === 'select') {
console.log(5)
// second data fetch from db
const answerWithChoices = await model.getQuestionChoices(question.id)
console.log(9)
// update question object with fetched data
question = Object.assign({}, question, {
choices: answerWithChoices.choices
})
}
return question
})
return questions
}
Модель
static async getQuestionChoices (questionId) {
console.log(6)
const answers = await db.choiceAnswers
.where('questionId').equals(intId)
.with({
selectChoices: 'choiceAnswersChoices'
})
console.log(7)
return answers.map(answer => {
console.log(8)
answer.choices = answer.selectChoices
return answer
})
}
Я ожидаю прочитать в консоли числа в следующей последовательности: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Вместо этого на консоли напечатана последовательность: 1, 2, 3, 4, 5, 6, 10, 7, 8, 9.
Это означает, что функция модели "getQuestionChoices" не ждет оператора возврата.
Как я могу это исправить?
Спасибо
1 ответ
Решение
Этот:
questions.map(async question => {
console.log(4)
if (question.answerType === 'select') {
console.log(5)
// second data fetch from db
const answerWithChoices = await model.getQuestionChoices(question.id)
console.log(9)
// update question object with fetched data
question = Object.assign({}, question, {
choices: answerWithChoices.choices
})
}
return question
})
Возвращает массив обещаний, результат нигде не присваивается
Исправление:
questions = await Promise.all(questions.map(async question => {
console.log(4)
if (question.answerType === 'select') {
console.log(5)
// second data fetch from db
const answerWithChoices = await model.getQuestionChoices(question.id)
console.log(9)
// update question object with fetched data
question = Object.assign({}, question, {
choices: answerWithChoices.choices
})
}
return question
}))