Javascript Async/await in Useffect hook不';不要等待一个函数
正如标题所说。我正在使用firestore进行聊天服务。我正在尝试设置一种在firestore更新时过滤消息的方法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)
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,它不会发生同步。根据您的代码结构,您必须在2useffects
中突破。第一个用于在装载时更新消息,第二个用于侦听消息更新:
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。Specificallyuseffect(函数调用getid,[messages])