В 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);
});