首页 > 解决方案 > 如何让我的函数在地图中返回一个值而不是一个待处理的 Promise?

问题描述

我正在使用 Node.js(我处于初学者级别)和 Google Cloud Firestore,我遇到了让我的地图函数等待我的getStuff()-function 的问题,而是返回一个 Promise 而不是值/文本本身。

我有两个这样的功能:

function getUserData() {
   return db.collection('users').get()
        .then((querySnapshot) => {
            var docs = querySnapshot.docs.map(doc => [doc.data(), doc.id, getStuff(doc.id)])
            console.log(docs)
            return docs                          
        });
}

function getStuff(doc_id) {
   return db.collection('users').doc(doc_id).collection('tweets').limit(1).get()
        .then((querySnapshot) => {
            var docs = querySnapshot.docs.map(doc => doc.data());         
            console.log("TWEETS", doc_id, docs[0]['text']);
            return docs[0]['text']
        });   
}

getStuff()函数生成控制台日志结果为:

TWEETS DAU86mxIhmD6qQQpH4F God’s country!
TWEETS JQHTO0jUjAodMQMR6wI I’m almost there Danny! 

console.log(docs)ingetUserData()返回:

  [
    {
      name: "John McClane",
      twitter: 'john4'
    },
    'Yn4rEotMR02jEQSqdV4',
    Promise { <pending> } // <- This is where the tweet should have been
  ]

我不熟悉 Promises 和 await/async,我无法让它工作。如何设置我的 getUserData 函数,以便它提供 Tweet 文本而不是 Promise { pending }?

标签: node.jsgoogle-cloud-firestoreasync-awaitpromise

解决方案


因为getStuff()返回一个承诺,你需要等待它来解决。

    async function getUserData() {
       return db.collection('users').get()
            .then((querySnapshot) => {
                var promises = querySnapshot.docs.map(async doc => {
                      var stuff = await getStuff(doc.id)
                      return [doc.data(), doc.id, stuff]
                })
               var docs =  await Promise.all(promises)
                console.log(docs)
                return docs                          
            });
    }

推荐阅读