是否有更简洁的方法来解决或拒绝在 forEach 循环中创建的 Promise?
Is there a more concise way to resolve or reject Promises that are created in a forEach loop?
我想从 Firebase 实时数据库 和 Firebase 存储 中读取数据。首先读取 RTDB。这是因为存储在 Firebase Storage 中的文件的名称是 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 数据中获取的键从存储中读取数据。数据读取成功后 Resolve Promise。否则拒绝。
- 创建所有 Promise 后,当所有 Promise 解析时,使用
someFunction
执行一些操作,这将更改创建的数据
看来我的代码有点太嵌套了。有没有更好的方法来实现上述目标?
不,代码是您所能得到的最简单的代码,但是,由于您所做的最后一件事是 returns 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 方法)
我想从 Firebase 实时数据库 和 Firebase 存储 中读取数据。首先读取 RTDB。这是因为存储在 Firebase Storage 中的文件的名称是 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 数据中获取的键从存储中读取数据。数据读取成功后 Resolve Promise。否则拒绝。
- 创建所有 Promise 后,当所有 Promise 解析时,使用
someFunction
执行一些操作,这将更改创建的数据
看来我的代码有点太嵌套了。有没有更好的方法来实现上述目标?
不,代码是您所能得到的最简单的代码,但是,由于您所做的最后一件事是 returns 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 方法)