javascript - 当 firebase 函数在另一个文件中时,如何让它保持打开状态

标签 javascript reactjs firebase firebase-realtime-database

我有一个名为 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/

相关文章:

javascript - 如何在 jQuery AJAX 调用中发送所有当前发布数据

javascript - Tinymce 4.x 的 Ajax 文件管理器

javascript - 未捕获的语法错误 : Unexpected token }

reactjs - 如何正确拆分调度和状态,以免重新渲染?

javascript - 在 Webpack 项目中获取 "Uncaught TypeError: path.parse is not a function"

javascript - 如何在页面加载时使用 ajax 提交隐藏表单?

javascript - 来自 React 组件的异步/等待调用操作

python - 无法在 Firebase 查询数据中传递变量

具有 Firebase Auth 和 MySQL 后端的 Android native 应用

ios - Crashlytics 在 Firebase 控制台中显示 75% 的 Crash-free 用户,但不显示崩溃日志?