我有以下函数,它接受一个参数(一个"名称"数组(,然后根据该数组检查我的Firebase数据库中每个用户的数据。
它使用它为每个用户编译一个"设置"数组,其中包含他们的电子邮件,以及用户与作为参数输入的列表共享的名称。该函数如下所示。
fbDaemon = ({ folderNames }) => {
const settings = [];
ref.once("value")
.then((snapshot) => {
snapshot.forEach(user => {
auth.getUser(user.key)
.then(function(userRecord) {
let email = userRecord.toJSON().email;
let zips = [];
user.forEach(setting => {
let dep = setting.val().department;
if(folderNames.includes(dep)){
zips.push(dep);
}
});
settings.push({ email, zips });
})
.catch(function(error) {
console.log("Error fetching user data:", error);
});
});
});
});
从本质上讲,它正在遍历我的整个数据库,并编译一个设置列表,我将传递给下一个函数。最终结果应如下所示:
[ { email: 'example@example1.com',
zips: [ 'Drug Enforcement Administration', 'Executive Branch' ] },
{ email: 'example@example2.com',
zips: [ 'FEMA', 'Congress' ] },
];
我现在遇到的问题是我无法在适当的时间返回"设置"数组。
如何重新配置此函数,以便仅在整个函数运行时返回设置数组?
换句话说,我想返回带有设置数组的已解决的承诺。我该怎么做?
也许你可以在这里使用Promise.all()
来解决一个承诺数组(其中数组中的每个项目对应于该项目/用户的getUser
调用(?
所以,大致如下:
fbDaemon = ({ folderNames, folderPaths }) => {
const settings = [];
return ref.once("value")
.then((snapshot) => {
// Collect all users from snapshot into an array
const users = []
snapshot.forEach(user => { users.push(user) })
// Create promise for each user, and use Promise.all to
// resolve when each "user promise" is complete
return Promise.all(users.map(user => {
// Be sure to add "return" here
return auth.getUser(user.key)
.then(function(userRecord) {
let email = userRecord.toJSON().email;
let zips = [];
user.forEach(setting => {
let dep = setting.val().department;
if(folderNames.includes(dep)){
zips.push(dep);
}
});
settings.push({ email, zips });
})
.catch(function(error) {
console.log("Error fetching user data:", error);
})
}));
}).then(function() {
return settings;
});
};