第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 Firestore 中處理多個(gè)相關(guān)的異步查詢

如何在 Firestore 中處理多個(gè)相關(guān)的異步查詢

慕慕森 2022-10-21 15:27:08
我想構(gòu)建一個(gè)以 Firebase 作為后端的問答應(yīng)用。Firestore 中有三個(gè)集合questions:answers和repliesToAnswers。中的文檔question有 1 個(gè)字段content,中的文檔answers有 2 個(gè)字段answerid和content,中的文檔repliesToAnswers有 3 個(gè)字段answerId,questionId并且content。questions: {    content}answers: {    questionId    content }repliesToAnswers {    content    answerId    questionId }我的目標(biāo)是構(gòu)建一個(gè)/question/:questionId獲取這樣的結(jié)構(gòu)化數(shù)據(jù)的 Restful API 端點(diǎn){    "content": "How to ...",    "answers": [        {            "content":"...",            "replies": [                {                    "content":"..."                },                {                    "content":"..."                }            ]        },        {            "content":"...",            "replies":[]        }    ],}所以我嘗試編寫容易出錯(cuò)的嵌套 Promises。exports.getQuestion = (request, response) => {  console.log(request.params);  let questionId = request.params.questionId;  let question = {};  firebase  .firestore()  .collection('questions')  .doc(questionId)  .get()  .then(doc => {    if(!doc.exists) {      throw Error("doc not exists")    }    return doc;  })  .then(doc => {    question.username = doc.data().username    return doc.id   })  .then(id => {    // retrive answsers     let answers = [];    firebase.firestore()    .collection('answers')    .where('questionId', '==', id)    .get()    .then(snapshot => {      if (snapshot.empty) {        console.log('no answers');        return answers;      }            snapshot.forEach(ans => {        // retrive replies               let replies = [];                firebase.firestore()          .collection('repliesToAnswers')          .where('questionId','==',questionId)          .where('answerId','==', ans.id)          .get()          .then(snapshot => {            if(snapshot.empty) {              console.log(`no reply to answer(id:${ans.id}) of question(${questionId})`);              return [];            }問題是該函數(shù)為每個(gè)答案返回了空的回復(fù)數(shù)組。它跳過了檢索每個(gè)答案的回復(fù)的請(qǐng)求。任何人都可以幫助我嗎?還是有更好的風(fēng)格來實(shí)現(xiàn)它?
查看完整描述

1 回答

?
Smart貓小萌

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊

我終于Promise.all()用更優(yōu)雅的代碼解決了這個(gè)問題。


exports.getQuestion = (request, response) => {



  let questionId = request.params.questionId;

 // let question = {};

  //let answers = [];


  // get info except answers 

  // { content:XXX, answers: []  }

  let fetchQuestion = firebase.firestore()

                      .doc(`questions/${questionId}`)

                      .get()

                      .then(doc => {

                        if(!doc.exists) {

                          throw Error('doc not exists');

                        }

                        return doc 

                      })

                      .then(doc => {

                        return {

                          content: doc.data().content,

                          id: doc.id,

                          answers: []

                        }

                      })

                      .catch(error => {

                        console.log(error)

                      });


  // return answers 

  let fetchAnswers =  firebase.firestore()

                      .collection('answers')

                      .where('questionId','==',questionId)

                      .get()

                      .then(snapshot => {

                        if(snapshot.empty) {

                          console.log('no replies'); 

                          return [];

                        } else {

                          let answers = []; 

                          snapshot.forEach(ans => {

                            // add answers to question

                            answers.push({

                              content: ans.data().content, 

                              replies: [], 

                              id: ans.id 

                            })


                          })


                          return answers;

                        }

                      }).catch(error => {

                        console.log(error); 

                      });


  


  let fetchAnsReplies = fetchAnswers.then(answers => {

    var promises = []; 

   

    answers.forEach(ans => {

      var promise = firebase.firestore() 

      .collection('repliesToAnswers')

      .where('answerId','==',ans.id)

      .get()

      .then(snapshot => {

        if(snapshot.empty) {


          console.log('no reply');

          return;

        } else {

          

          snapshot.forEach(reply => {

         

            ans.replies.push({

              content: reply.data()

            })

          })

        } 

      }).catch(error => {

        console.log(error); 

      })


      promises.push(promise);

    })



    return Promise.all(promises).then(() => {

      

      return answers;

    })


  }).catch(error => {

    console.log(error);

  })


  return Promise.all([fetchQuestion,fetchAnswers, fetchAnsReplies])

  .then(results => {

    return response.json({...results[0],answers:results[2]});

  }).catch(error => {

    console.log(error);

    response.status(500).json({

      error: error.code

    })


  })


}


查看完整回答
反對(duì) 回復(fù) 2022-10-21
  • 1 回答
  • 0 關(guān)注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)