useEffect挂钩,用于从返回承诺的函数中更新状态

时间:2020-10-15 02:43:03

标签: javascript oop google-cloud-firestore functional-programming

我有一个返回对象的函数。

看起来像这样

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()。那不是函数

我要去哪里错了?

1 个答案:

答案 0 :(得分:1)

onSnapshot不返回承诺。它返回一个取消订阅函数,您可以调用该函数从DocumentReference中删除侦听器。您可以在documentation中看到一个示例。当您调用question.output.function()时,它将返回此取消订阅功能。

快照侦听器用于接收随时间变化的文档更新。如果您尝试执行单个查询而不监听正在进行的更改,则应使用get()而不是onSnapshot(),如documentation所示。 get()返回一个承诺,该承诺以DocumentSnapshot进行解析,其中包含文档数据。