【发布时间】:2020-05-10 09:25:55
【问题描述】:
如何构建一个异步获取一些数据然后使用该数据获取更多异步数据的函数?
我正在使用 Dexie.js(indexedDB 包装器)来存储有关直接消息的数据。我在对象中存储的一件事是我将要向其发送消息的用户 ID。为了构建更好的 UI,我还获取了有关该用户的一些信息,例如存储在远程 rdbms 上的个人资料图片、用户名和显示名称。构建完整的链接组件需要来自两个数据库(本地 indexedDB 和远程 rdbms)的数据。
我的解决方案返回一个空数组。在 Google Chrome 中记录它时正在计算它,我确实看到了我的数据。然而,因为这不是在渲染时计算的,所以数组总是空的,因此我不能迭代它来构建一个组件。
const [conversations, setConversations] = useState<IConversation[]>()
const [receivers, setReceivers] = useState<Profile[]>()
useEffect(() => {
messagesDatabase.conversations.toArray().then(result => {
setConversations(result)
})
}, [])
useEffect(() => {
if (conversations) {
const getReceivers = async () => {
let receivers: Profile[] = []
await conversations.forEach(async (element) => {
const receiver = await getProfileById(element.conversationWith, token)
// the above await is a javascript fetch call to my backend that returns json about the user values I mentioned
receivers.push(receiver)
})
return receivers
}
getReceivers().then(receivers => {
setReceivers(receivers)
})
}
}, [conversations])
/*
The below log logs an array with a length of 0; receivers.length -> 0
but when clicking the log in Chrome I see:
[
0: {
avatarURL: "https://lh3.googleusercontent.com/..."
displayName: "Cool guy"
userId: "1234"
username: "cool_guy"
}
1: ...
]
*/
console.log(receivers)
我的计划是使用 map 遍历这个数组
{
receivers && conversations
? receivers.map((element, index) => {
return <ChatLink
path={conversations[index].path}
lastMessage={conversations[index].last_message}
displayName={element.displayName}
username={element.username}
avatarURL={element.avatarURL}
key={index}
/>
})
: null
}
我怎样才能写这个不返回一个空数组?
这是一个与我正在经历的事情相关的 SO 问题here
【问题讨论】:
标签: javascript reactjs indexeddb