Javascript Async/await in Useffect hook不';不要等待一个函数

Javascript Async/await in Useffect hook不';不要等待一个函数,javascript,reactjs,react-native,asynchronous,google-cloud-firestore,Javascript,Reactjs,React Native,Asynchronous,Google Cloud Firestore,正如标题所说。我正在使用firestore进行聊天服务。我正在尝试设置一种在firestore更新时过滤消息的方法 constusers=useSelector((state)=>state.assignUser); const[messages,setMessages]=useState([]); const chatID='KfM3GNxeVATi6sNFFUEG' 函数getIDs(messageObj){ 返回messageObj.map(message=>message.\u id)

正如标题所说。我正在使用firestore进行聊天服务。我正在尝试设置一种在firestore更新时过滤消息的方法

constusers=useSelector((state)=>state.assignUser);
const[messages,setMessages]=useState([]);
const chatID='KfM3GNxeVATi6sNFFUEG'
函数getIDs(messageObj){
返回messageObj.map(message=>message.\u id)
}
useffect(()=>{
const messagesArray=[]
db.collection('messages').doc(chatID)。collection('messages').get()。然后(快照=>{
snapshot.forEach(doc=>messagesArray.push(doc.data()))
设置消息(messagesArray)
异步函数fetchMessages(){
const messageIDs=wait getIDs(消息)
db.collection('messages').doc(chatID).collection('messages').onSnapshot(doc=>{
文件forEach((文件)=>{
if(messageIDs.indexOf(document.data().\u id!==-1))console.log('is',messageIDs.indexOf(document.data().\u id))
else console.log('notfoundssw')
})
})
}
fetchMessages()
})
}, [])

wait不等待getIDs函数,并且
messageIDs.indexOf(document.data().\u id)
的日志对于每个条目都是-1。我不明白为什么async/await错误行为

我不能完全理解您是如何获取数据的,但设置状态实际上是异步的,因此您无法保证在执行
映射时更新所有状态数据

我会把你的
useffect
分成两个不同的部分


第二个将包含
fetchMessages
调用的调用应使用“messages”作为其依赖项数组的一部分,即,它将在“messages”状态更新后执行。

您的
messagesIDs
变量取决于messages state update,它不会发生同步。根据您的代码结构,您必须在2
useffects
中突破。第一个用于在装载时更新消息,第二个用于侦听消息更新:

  useEffect(() => {
    const messagesArray = []

    db.collection('messages').doc(chatID).collection('messages').get().then(snapshot => {
      snapshot.forEach(doc => messagesArray.push(doc.data()))
      setMessages(messagesArray)
    })
  }, [])


  useEffect(() => {
    // check if messages is not empty
    if(!messages.length) return

    const messageIDs = getIDs(messages) // your getIDs is not async, so no need to await
    db.collection('messages').doc(chatID).collection('messages').onSnapshot(doc => {
      doc.forEach((document) => {
        if (messageIDs.indexOf(document.data()._id) !== -1) {
          console.log('the is is ', messageIDs.indexOf(document.data()._id))
        } else {
          console.log('notfoundssw')
        }
      })
    })
}, [messages])

看起来没有什么可以等待的,因为Array.prototype.map是一个完全同步的函数,在
fetchMessages
中映射id仍然会出错,并导致
messageIDs.indexOf(document.data().\u id)
的日志记录为-1代码中有一个输入错误,应该是:
if(messageIDs.indexOf(document.data()。_id)!==-1)
谢谢@EmileBergeron我没有注意到。但是原始问题仍然存在。您是否希望
设置消息
立即更改消息的值?这不是它的工作方式。它只会在下一个渲染周期中发生。如果您想收听对
消息的更改,您需要使用另一个useEffect。Specifically
useffect(函数调用getid,[messages])