【问题标题】:useEffect hook to update state from a function that returns a promiseuseEffect 挂钩从返回承诺的函数更新状态
【发布时间】:2021-01-29 11:55:18
【问题描述】:

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

看起来像这样

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().then is not a function

我哪里出错了?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 嗯...我需要onSnapshot 进行实时更新,我试过get() 但它返回旧数据。
    • get() 仅在离线时返回旧数据。在线时,它访问服务器。如果您需要实时更新,那么您将不得不在 onsnapshot 回调中编写代码以将结果传递到您的 UI。它不会像我解释的那样直接从 aggResults 返回数据。
    猜你喜欢
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2021-03-30
    • 2019-12-27
    • 1970-01-01
    • 2022-12-06
    相关资源
    最近更新 更多