我有一个名为db.js的文件,可以从中进行所有的firebase调用。
我正在从另一个名为home.js的文件中调用db.js中的函数 如何使Firebase连接保持打开状态并将数据传递回home.js?我不能使用诺言,因为那样会关闭连接。
这是db.js中的函数:
export function getShopNames() {
let userID = auth.currentUser.uid
let stores = []
userDB.ref('/users/' + userID + "/stores").on('value', snap => {
snap.forEach(storeNames => {
stores.push(storeNames.key)
})
return stores
})
}
我这样在家叫:
let stores = db.getShopNames()
我希望它能正常工作,因此,如果将新商店添加到实时数据库中,则变量会更新
答案 0 :(得分:1)
JavaScript中没有基于文件范围的概念。从您调用on('value'
的那一刻开始,直到您在同一位置调用off
或加载新页面为止,侦听器都将保持活动状态。
但是您的return stores
目前没有做任何有意义的事情。它从回调函数返回一个没人会看到/使用的值。
数据是从Firebase异步加载的,这意味着您不能以正常方式从函数返回数据。到return语句运行时,数据尚未加载。这就是为什么您通常会返回一个所谓的Promise,然后在数据加载时解析的原因。
在您的职能中,应该是:
export function getShopNames() {
return new Promise(function(resolve, reject) {
let userID = auth.currentUser.uid
let stores = []
userDB.ref('/users/' + userID + "/stores").once('value', snap => {
snap.forEach(storeNames => {
stores.push(storeNames.key)
})
resolve(stores);
}, (error) => {
reject(error);
})
}
现在您可以像这样调用此函数:
getShopNames().then((shopnames) => {
console.log(shopnames);
})
更新:您评论说,您也想处理商店名称的更新,不能使用once()
并且不能使用承诺(因为承诺只能解决一次)。
改为传递自定义回调,并在每次商店名称更改时调用该回调:
export function getShopNames(callback) {
let userID = auth.currentUser.uid
let stores = []
userDB.ref('/users/' + userID + "/stores").once('value', snap => {
snap.forEach(storeNames => {
stores.push(storeNames.key)
})
callback(stores);
})
}
然后像这样调用它:
getShopnames(function(shopnames) {
console.log(shopnames);
});