Причина в том, что Firebase загружает данные асинхронно.Поскольку это может занять некоторое время, это позволяет вашему коду продолжить работу.Затем, как только данные становятся доступны, он вызывает ваш обратный вызов с моментальным снимком данных.
Проще всего это увидеть с некоторыми удачно расположенными лог-операторами:
console.log("Before starting query")
firebase.database().ref().child("clients").orderByChild("ID").limitToLast(1)("value", function (snapshot) {
console.log("Got data");
});
console.log("After starting query")
Когда вы запускаете этокод, он печатает:
Перед началом запроса
После запуска запроса
Получил данные
Это, вероятно, не тот порядок, которыйты ожидалНо это прекрасно объясняет, почему не удается вызвать setState
в вашем коде.Когда вы звоните setState
, данные еще не загружены.
cellNum
доступен только внутри обратного вызова.Таким образом, вызов к setState
также должен быть в этом обратном вызове:
firebase.database().ref().child("clients").orderByChild("ID").limitToLast(1)("value", function (snapshot) {
snapshot.forEach(function(childSnapshot) {
var cellNum=childSnapshot.val().CellNum;
this.setState({
ID: cellNum
}, () => { });
});
});