firebase 通过不同用户循环未得到预期结果[已关闭]

3bygqnnd  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(111)

19小时前关门了。
Improve this question
用户电子邮件列表在一个单独的脚本(称为Script A)中从数据库中获取,然后推入数组(email)以循环。
电子邮件地址=[www.example.com,www.example.com] xyz@gmail.com , abc@gmail.com ]
数组在另一个脚本中引用,称为Script B

  • 数据库的层次结构设置为:*

1.用户

  1. www.example.com--〉{用户名: xyz@gmail.com示例网站} John Doe, userAlternateEmail:john@gmail.com}
  2. www.example.com--〉{用户名: abc@gmail.com示例网站} Jane Smith, userAlternateEmail:jane@gmail.com}
  • 脚本B的代码 *
for ( let i = 0; i < email.length; i++ )
    {
      db.collection( `usersDb/${ email[i] }/records` ).get().then( ( querySnapshot ) =>
      {  
        querySnapshot.forEach( ( doc ) =>
        {
          if ( doc.data().softDelete !== true )
          {
              showDetails( doc)
          }
        } )
      } )
    }
    • 显示详细信息(文档)**
  • showDetails(doc)函数用于在页面上显示用户的所有详细信息。*
let showDetails = doc => {
let userDetails= `
  
<div>
  <span>${ doc.data().userName } </span>
  <span>${ doc.data().userAlternateEmail } </span>
</div>
             
  `
  showUserData.innerHTML += userDetails

}

Db的路径是用户电子邮件的连接,为了匹配该路径并获取用户电子邮件,对Db的调用在for循环中,该循环提供用户电子邮件。

    • 问题:**

用我的方法,我只得到第一个用户的详细信息,而不是所有的用户的预期。

    • 如何确保调用数据库运行所有电子邮件并提供每封电子邮件的详细信息?**
2hh7jdfx

2hh7jdfx1#

首先,我们将其分解,以便使用函数返回给定电子邮件地址的所有记录:

function getRecordsForEmail(db, email) {
  return db.collection(`usersDb/${email}/records`)
    .then(querySnap => {
      return querySnap.docs
        .filter(docSnap => docSnap.get("softDelete") !== true)
        .map(docSnap => ({
          userName: docSnap.data().userName,
          userAlternateEmail: docSnap.data().userAlternateEmail
        });
    })
}

现在我们有了一个函数来获取给定电子邮件的记录,我们可以使用Array#map来获取email中每封电子邮件的结果。这些函数调用中的每一个都将返回一个Promise,我们可以将其放入Promise.all中以等待每一个完成。一旦它们都完成了,我们可以使用Array#flatMap来检查每个调用返回的数组。将它们扁平化为一个大的HTML字符串数组,然后将它们连接在一起,最后更新showUserData的内容。

const db = firebase.firestore();

Promise.all(
  email.map(em => getRecordsForEmail(db, em))
)
  .then((recordsGroupedByEmail) => {
    const newInnerHTML = recordsGroupedByEmail
      .flatMap(record => (
`<div>
  <span>${ record.userName } </span>
  <span>${ record.userAlternateEmail } </span>
</div>`
      ))
      .join("\r\n\r\n");

    showUserData.innerHTML = newInnerHTML;
  })
  .catch(err => {
    /* don't forget error handling */
    console.error("Failed to get data", err);
  })

相关问题