node.js - 如何让我的函数在地图中返回一个值而不是一个待处理的 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 }?
解决方案
因为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
});
}
推荐阅读
- c# - 清除 runtimeTypeCache
- javascript - 为什么我的“搜索”功能只适用于我的 Boostrap 表的某些列?
- laravel - 类 App\Http\Controllers\CategoriesController 不存在
- kubernetes - 为什么既需要活力又需要准备
- python - 具有高级计算功能的 Keras 自定义层
- javascript - 未捕获的类型错误:无法解构“未定义”或“空”的属性“名称”
- javascript - Material-UI TextField 类型日期不适用于 IE
- android - 使用 UsbManager 在 Android 中取消打印作业
- java - 设置数据到微调器,并在微调器中发送选定数据的密钥
- java - 将 ContainerResponseFilter 添加到码头服务器