Быстрый поиск PouchDB: поиск внутри цикла и возврат результатов ПОСЛЕ окончания цикла
У меня есть следующая структура документа:
{
"_id": "car_1234",
"_rev": "1-9464f5d70547c255a423ff8dae653db1",
"Tags": [
"Audi",
"A4",
"black"
],
"Car Brand": "Audi",
"Model": "A4",
"Color": "black",
"CarDealerID": "5"
}
Tags
поле хранит информацию о документе в списке. Эта структура должна оставаться такой. Теперь у пользователя есть возможность искать автомобили в поле ввода текста HTML, где ,
представляет собой разделение между автомобилями. Давайте возьмем следующий пример:
черный ауди, розовый ауди а4
Здесь пользователь хочет найти черный Audi или розовый Audi A4. Мой подход к запросам через базу данных заключается в разделении введенных слов на следующую структуру [["black", "Audi"],["pink", "Audi", "A4"]]
и искать внутри Tags
поле каждого документа в БД, если все слова в подмассиве (например, "черный" и "Audi") существуют и для возврата CarDealerID
,
///Before this I return the word list as described
}).then(function (wordList) {
results = [];
for (var i = 0; i < userWords.length; i++) {
//Check if the object is a single word or an array of words
if (wordList[i].constructor === Array) {
//Recreate the words in the array as one string
wordString = ""
wordList[i].forEach(function (part) {
wordString += part + " "
})
wordString = wordString.trim()
//Search for the car
car_db.search({
query: wordString,
fields: ["Tags"],
include_docs: true
}).then(function(result) {
result.rows.forEach(function (row) {
results.push(row.doc.CarDealerID)
})
})
} else {
car_db.search({
query: userWords[i],
fields: ["Tags"],
include_docs: true
}).then(function(result) {
result.rows.forEach(function (row) {
results.push(row.doc.CarDealerID)
})
})
}
return results
}).then(function(results) {
console.log(results)
}).catch(function (err) {
console.log(err)
});
Моя проблема
Моя проблема сейчас в том, что результаты возвращаются до for
цикл заканчивается. Вероятно, это связано с тем, что это асинхронная процедура, и результат должен ждать возврата до завершения этой асинхронной операции. Но я не знаю, как этого добиться. Я надеюсь, что кто-то может мне помочь.
1 ответ
Благодаря блогу Нолана Лоусона ("Ошибка новичка №2") я смог это понять. Вместо for
петля, я использую
return Promise.all(wordList.map(function (i) {
results = [];
//
//Same Code as before
//
//Return results inside the map function
return results;
}));