当Firebase函数位于另一个文件中时,如何保持打开状态

时间:2018-10-24 04:18:02

标签: javascript reactjs firebase firebase-realtime-database

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

我希望它能正常工作,因此,如果将新商店添加到实时数据库中,则变量会更新

1 个答案:

答案 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);
});