typeahead.js не получает данные из локального

#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 в свое приложение?