Как я могу оставить функцию firebase открытой, когда она находится в другом файле? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть файл с именем db.js, из которого я делаю все мои вызовы firebase.

Я вызываю функцию в db.js из другого файла с именем home.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 голосов
/ 24 октября 2018

В JavaScript отсутствует понятие области действия на основе файлов.Слушатель будет активен с того момента, как вы наберете on('value', до тех пор, пока вы не наберете off в том же месте или не загрузите новую страницу.

Но ваш return stores не сделает ничего значимогопрямо сейчас.Он возвращает значение из функции обратного вызова, которую никто никогда не увидит / не использует.

Данные загружаются из Firebase асинхронно, что означает, что вы не можете вернуть их из функции обычным способом.К тому времени, когда выполняется оператор return, данные еще не загружены.Вот почему вы обычно возвращаете так называемое обещание, которое затем разрешается после загрузки данных.

В вашей функции это будет:

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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...