我有一个名为 db.js 的文件,我从中进行所有的 firebase 调用。
我正在从另一个名为 home.js 的文件中调用 db.js 中的函数 如何使 firebase 连接保持打开状态并将数据传回 home.js?我不能使用 promise ,因为它会关闭连接。
这是来自 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()
我希望它能工作,这样如果一个新商店被添加到实时数据库,变量就会更新
最佳答案
JavaScript 中没有基于文件范围的概念。从您调用 on('value'
的那一刻起,监听器将保持事件状态,直到您在同一位置调用 off
或直到您加载新页面。
但是您的返回商店
目前没有做任何有意义的事情。它从回调函数中返回一个没人会看到/使用的值。
数据是从 Firebase 异步加载的,这意味着您不能以正常方式从函数返回它。返回语句运行时,数据尚未加载。这就是为什么您通常会返回一个所谓的 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()
并且不能使用 promises(因为那些只解析一次)。
改为传递自定义回调,并在每次商店名称更改时调用它:
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);
});
关于javascript - 当 firebase 函数在另一个文件中时,如何让它保持打开状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52961047/