我想从Firebase实时数据库和Firebase存储中读取数据。首先读取RTDB。这是因为存储在Firebase存储中的文件名是RDTB中数据的键。我有以下代码:
let newReadRef = firebase.database().ref('someRef').limitToLast(3).once('value').then(snapshot => {
let promiseArray = [];
snapshot.forEach(e => {
promiseArray.push(new Promise((resolve, reject) => {
//Do all the things I need to do before trying to get data from my Firebase Storage
let filePathRef = firebase.storage().ref(e.val().key);
filePathRef.getDownloadURL().then(url => {
//Do something with the url
resolve('Promise resolved');
}).catch(e => {
console.log(e);
reject('Rejected');
});
}));
});
Promise.all(promiseArray).then(someFunction);
});
这个想法是:
从我的RTDB检索一些数据,稍后将使用其密钥在Firebase存储中检索数据
为我的RTDB中读取的每个数据创建一个新的Promise
对于每个创建的Promise,使用从RTDB数据获得的密钥从存储中读取数据。成功读取数据后,解决Promise。否则,拒绝。
在创建所有Promise之后,当所有Promise都解决后,使用
someFunction
进行某些操作,这将更改创建的数据看来我的代码有点嵌套。有没有更好的方法来实现上述目标?
最佳答案
不,代码几乎可以得到,但是由于您做的最后一件事返回了Promise,因此您无需创建Promise
snapshot.forEach(e => {
//Do all the things I need to do before trying to get data from my Firebase Storage
let filePathRef = firebase.storage().ref(e.val().key);
promiseArray.push(
filePathRef.getDownloadURL()
.then(url => {
//Do something with the url
return 'Promise resolved';
}).catch(e => {
console.log(e);
throw 'Rejected';
});
);
});
我本来建议使用
.map
代替.forEach
,但是如果我记得,snapshot
不是Javascript数组(它具有forEach,但没有map方法)