【发布时间】:2021-02-24 18:29:04
【问题描述】:
正如标题所说。我正在为我的聊天服务使用 Firestore。我正在尝试设置一种在 Firestore 更新时过滤掉消息的方法
const users = useSelector((state) => state.assignUser);
const [messages, setMessages] = useState([]);
const chatID = 'KfM3GNxeVATi6sNFFUEG'
function getIDs(messageObj){
return messageObj.map(message => message._id)
}
useEffect(() => {
const messagesArray = []
db.collection('messages').doc(chatID).collection('messages').get().then(snapshot => {
snapshot.forEach(doc => messagesArray.push(doc.data()))
setMessages(messagesArray)
async function fetchMessages(){
const messageIDs = await getIDs(messages)
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')
})
})
}
fetchMessages()
})
}, [])
await 不等待 getIDs 函数,messageIDs.indexOf(document.data()._id) 的日志对于每个条目都是 -1。我无法弄清楚为什么 async/await 行为不端
【问题讨论】:
-
看起来没什么可等待的,因为 Array.prototype.map 是一个完全同步的函数
-
映射
fetchMessages中的id 仍然会出错并导致messageIDs.indexOf(document.data()._id)的日志记录为-1 -
代码有错别字,应该是:
if (messageIDs.indexOf(document.data()._id) !== -1) -
谢谢@EmileBergeron 我没注意到。但原来的问题仍然存在
-
您是否希望
setMessages立即更改消息的值?这不是它的工作原理。它只会在下一个渲染周期中发生。如果您想收听对messages的更改,您需要使用另一个 useEffect。具体useEffect(functionThatCallGetIds, [messages])
标签: javascript reactjs react-native asynchronous google-cloud-firestore