Я новичок в веб-разработке, и такие вещи, как асинхронность и обещания, мне пока не очень понятны, поэтому, возможно, этот вопрос может показаться немного базовым.
В основном мне нужно получить детали "урока".В подробностях урока приведен список идентификаторов, которые нужно будет извлечь из другой коллекции.Поскольку fire base не поддерживает запросы WHERE IN, я перебираю значения по одному, выполняю запрос и добавляю результат в массив.
У меня есть один запрос для извлечения деталей «урока» и другой запрос для извлечения списка «слов» по идентификатору, оба эти запроса вызываются последовательно из третьей функции, и я сделал их все синхронными, потому чтов противном случае я получаю сообщение об ошибке, что word_ids (в getWordsById) не определен (так как он не имеет значения, пока не будет выполнено обещание из запроса до).
Есть ли способ сделать это асинхронно, чтобы мне не приходилось чередовать синхронные запросы?Я чувствую, что мне не хватает понимания того, как работают обещания
async getWordsById(word_ids) {
var words = []
var arrayLength = word_ids.length;
for (var i = 0; i < arrayLength; i++) {
await this.db.collection('words_2').doc(word_ids[i])
.get().then(function(snap) {words.push(snap.data())})
}
//console.log("Words In Func: ", words)
return words
}
async getPractice (lessonId) {
var practice_details;
await this.db.collection('practice').doc(lessonId)
.get().then(snap => {practice_details = snap.data(); return practice_details;})
//console.log("Out: ", practice_details)
return practice_details;
}
async getThem (lessonId) {
var lesson_info = await this.getPractice(lessonId)
//console.log("Lesson info:", lesson_info.words_id.split(","))
var word_info = this.getWordsById(lesson_info.words_id.split(","))
//console.log("words ", word_info)
return word_info;
}