【发布时间】:2019-08-08 08:07:52
【问题描述】:
我有一个函数可以映射数组的每个元素(在本例中为电子邮件地址),生成一组应解析为 Firebase 自动生成的文档 ID(即hAvJ3qPq821tq1q2rrEv, 0tjeKB1aW8jsOAse5fcP)的 Promise。
async function addMultipleParticipants(participant_emails: Array<string>) {
console.log("Parallelizing participant processing");
const promises = participant_emails.map(addParticipant);
const document_ids = await Promise.all(promises);
console.log("Final document ids: " + document_ids);
return document_ids;
};
这是返回文档 ID 的函数,具体取决于它是否可以找到与电子邮件地址关联的现有文档或需要创建新文档。
async function addParticipant(email_address: string) {
try {
console.log("Querying for person");
const query = await db.collection('people')
.where('emails', 'array-contains', email_address)
.limit(1);
const querySnapshot = await query.get();
if (!querySnapshot.empty) {
console.log("Document exists for email " + email_address);
// TODO: There is only one, so we shouldn't have to iterate
querySnapshot.forEach(function(docRef: any) {
console.log("New document id: " + docRef.id);
const document_id = docRef.id;
return document_id;
});
} else {
console.log("Creating person with " + email_address);
const fields = {emails: [email_address]};
try {
const docRef = await db.collection('people').add(fields);
console.log("New document id: " + docRef.id);
const document_id = docRef.id;
return document_id;
} catch (err) {
console.log("Error adding document:", err);
}
}
} catch (err) {
console.log("Error getting document:", err);
}
};
当文档中尚不存在所有参与者电子邮件时,函数按预期工作,console.log() 输出 Final document ids: hAvJ3qPq821tq1q2rrEv, 0tjeKB1aW8jsOAse5fcP。
但是,当至少一个电子邮件地址与现有文档相关联时,来自addParticipant() 的承诺不会解析为任何内容,并且console.log() 会输出Final document ids: ,。
在这种情况下,我需要做些什么来确保 Promise 数组在 addMultipleParticipants() 中正确解析?
【问题讨论】:
标签: javascript typescript firebase promise google-cloud-firestore