NodeJs / Firestore / React - сохранение результатов запроса Firestore в состояние

Я думаю, чтобы избежать такой проблемы на локальном, сеансовом, куки, вы можете использовать библиотеку opendb ..

Ex-In, в которой вы можете решить эту проблему с помощью этого фрагмента

// for set object in db
db.local.setJSON("key", {name: "xyz"});  

// for get object form db
db.local.getJSON("key");

https://github.com/pankajbisht/openDB

Для получения дополнительной информации о веб-хранилище вы можете прочитать статью web storage .

0
задан A.b 20 March 2019 в 12:57
поделиться

1 ответ

Данные загружаются из Firestore асинхронно. Остальная часть вашего кода продолжает выполняться, пока загружаются данные, и затем ваш обратный вызов then вызывается, как только данные появляются.

Проще всего это увидеть с помощью нескольких правильно расположенных операторов журнала:

console.log("Starting to load data");
docRef.get().then(function (doc) {
  console.log("Got data");
});
console.log("Started to load data");

Когда вы запускаете это, он печатает:

Начало загрузки данных [ 1126]

Начата загрузка данных

Получены данные

Вероятно, это не тот результат, который вы ожидали, но он полностью объясняет поведение, которое вы видите. Прямо сейчас ваш return store запускает перед store = doc.data(), что объясняет, почему вы не получаете желаемый результат.


Это означает, что любой код, которому нужны данные, должен находиться внутри обратного вызова then(). Поэтому, если вы переместите вызов на setState() сразу после store = doc.data(), он будет работать:

docRef.get().then(function (doc) {
  if (doc.exists) {
    store = doc.data();
    this.setState({name: store});
  } else {
    // doc.data() will be undefined in this case
    console.log("No such document!");
  }
})

В качестве альтернативы, вы можете вернуть значение из then() вверх. В этом случае вам также понадобится then() в вашем коде вызова:

function collectres () {
  var docRef = db.collection("cities").doc("SF");
  return docRef.get()
    .then(function (doc) {
      if (doc.exists) {
        return doc.data();
      } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
      }
    })
    .catch(function (error) {
      console.log("Error getting document:", error);
    });
}

И затем вызовите его с помощью:

Random() {
    let a = '';
    user.collectres().then(function(a) {
      this.setState({name:a});
    });
}

Асинхронные API чрезвычайно распространены в Современное программирование, поэтому я настоятельно рекомендую прочитать их. Для получения дополнительной информации см .:

0
ответ дан Frank van Puffelen 20 March 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: