我是JS的初学者,目前正在做一个项目,该项目是从Firebase Realtime DB提取基本信息的。我有一个功能,可以检查数据库中有多少个项目,另一个可以获取特定值。当我检查它们在这些方法内返回的值时,它很好-当我在其他地方调用它们时,就会出现问题。我相信这是由于这些功能的异步性质。我不确定如何构造它们以避免出现此问题。我知道我需要使用Promises和.then函数,但不确定如何使用。这是我的两个功能:
var urls = [];
function gotData(data) {
var number = randomNumberGenerator();
dbRefObject.once("value", function (snapshot) {
snapshot.forEach(function (childSnapshot) {
var childData = childSnapshot.val().URL;
urls.push(childData);
});
});
}
和
function randomNumberGenerator() {
dbRefObject.on("value", (snap) => {
var totalRecord = snap.numChildren();
console.log(Math.floor(Math.random() * totalRecord));
});
}
当我将console.log语句放入这些方法中时,它们可以正常工作-当我在其他地方调用它们时,就会出现问题。例如,当我在其他地方调用urls数组时,它不会返回“未定义”以外的任何内容。我将非常感谢您的帮助。
答案 0 :(得分:0)
dbRefObject.once
本质上是异步的(流)
// This is async in nature
dbRefObject.once("value", function (snapshot) {
snapshot.forEach(function (childSnapshot) {
var childData = childSnapshot.val().URL;
urls.push(childData);
});
});
// urls will be undefined here
解决方案:使用回调功能
dbRefObject.once("value", function (snapshot) {
snapshot.forEach(function (childSnapshot) {
var childData = childSnapshot.val().URL;
urls.push(childData);
urlsUpdated(urls)
});
});
function urlsUpdated(urls) {
// Do something herer
console.log(urls)
}