Я думаю, чтобы избежать такой проблемы на локальном, сеансовом, куки, вы можете использовать библиотеку 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 .
Данные загружаются из Firestore асинхронно. Остальная часть вашего кода продолжает выполняться, пока загружаются данные, и затем ваш обратный вызов then
вызывается, как только данные появляются.
Проще всего это увидеть с помощью нескольких правильно расположенных операторов журнала:
console.log("Starting to load data");
docRef.get().then(function (doc) {
console.log("Got data");
});
console.log("Started to load data");
Когда вы запускаете это, он печатает:
Начало загрузки данных [ 1126]
Начата загрузка данных
Получены данные
blockquote>Вероятно, это не тот результат, который вы ожидали, но он полностью объясняет поведение, которое вы видите. Прямо сейчас ваш
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 чрезвычайно распространены в Современное программирование, поэтому я настоятельно рекомендую прочитать их. Для получения дополнительной информации см .: