#javascript #google-cloud-firestore #typeahead.js #bloodhound
#javascript #google-cloud-firestore #typeahead.js #ищейка
Вопрос:
Прежде всего, это вопрос новичка 🙂 Извините за беспокойство…
Мне удалось получить данные из Firebase Firestore и поместить эти данные в переменную.
var db = firebase.firestore();
let contentJSON = [];
db.collection("blog-posts").get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
var listTemp = {
"category": doc.data().category,
"content": doc.data().content,
"date": doc.data().date,
"slug": doc.data().slug,
"title": doc.data().title
};
contentJSON.push(listTemp)
});
});
Затем я создаю новый экземпляр Bloodhund с этими локальными данными.
var blogPosts = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('content'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
local: contentJSON,
});
При поиске в этой настройке ничего не появляется.
Я попытался запустить его с помощью внешнего JSON с помощью метода предварительной выборки, и это сработало, однако мне нужно запустить его с локальными данными. Я думаю, что есть проблема со структурой локальной переменной данных. Не могли бы вы взглянуть и помочь мне?
Ответ №1:
Вероятно, это проблема AJAX, которую можно решить с помощью promises и async / await.
Необходимо разрешить первое тело кода .then()
, вы можете запустить второе тело кода. В противном случае код firebase завершается после bloodhound, и он должен завершиться раньше.
Если вы поместите код firebase в функцию, подобную этой
// (1) add async here
async getBlogPosts() {
var db = firebase.firestore();
// (2) add return here
return db.collection("blog-posts").get().then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
// (3) move variable in here
let contentJSON = [];
var listTemp = {
"category": doc.data().category,
"content": doc.data().content,
"date": doc.data().date,
"slug": doc.data().slug,
"title": doc.data().title
};
contentJSON.push(listTemp)
// (4) return here
return contentJSON
});
});
А затем вызовите его с помощью await в вашем интерфейсном коде
// (5) the async await will make sure this function happens before we proceed
var contentJSON = await getBlogPosts()
var blogPosts = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('content'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
local: contentJSON,
});
Комментарии:
1. Спасибо за ответ. В нем говорится, что в коде есть ошибка. Неперехваченная ошибка синтаксиса: неожиданный идентификатор (первый })
2. можете ли вы опубликовать полную ошибку? включили ли вы пакет firestore в свое приложение?