我有一个返回对象的函数。
看起来像这样
const aggResults = data => {
const { surveyName, questionId } = data
const db = firebase.firestore()
const surveyData = db.collection('surveys').doc(surveyName)
return surveyData.onSnapshot(doc => {
console.log('test', doc.data().aggResults[questionId])
return doc.data().aggResults[questionId]
})
}
从同一文件中,我这样调用函数
{
...
output: {
...
function: () => aggResults({ surveyName: '...', questionId: '...' }),
},
},
在另一个文件中,我想根据aggResults
返回的内容来更新状态。
我已经用过useEffect钩子了
const [data, updateData] = useState({})
useEffect(() => {
if (!_.isUndefined(question.output)) {
question.output.function().then(res => updateData(res))
} else {
console.log('q', question.output)
}
}, [question])
此刻我遇到的错误是 TypeError:question.output.function()。那不是函数
我要去哪里错了?
答案 0 :(得分:1)
onSnapshot不返回承诺。它返回一个取消订阅函数,您可以调用该函数从DocumentReference中删除侦听器。您可以在documentation中看到一个示例。当您调用question.output.function()
时,它将返回此取消订阅功能。
快照侦听器用于接收随时间变化的文档更新。如果您尝试执行单个查询而不监听正在进行的更改,则应使用get()
而不是onSnapshot()
,如documentation所示。 get()
返回一个承诺,该承诺以DocumentSnapshot进行解析,其中包含文档数据。