gpt4 book ai didi

javascript - 在同一个 promise 中将用户和头像 URL 相互链接

转载 作者:行者123 更新时间:2023-12-03 01:03:54 25 4
gpt4 key购买 nike

需要一些帮助。从 firebase 中,我收集了所有用户,得到了一个包含键值对的对象数组。对于这个对象,我想添加另一个键值对:

avatarUrl: 'someurl'

然后我想将其分派(dispatch)到我的 reducer 。

我对将两者结合起来有点困惑,这是我的进展:

const collectionRef = dbf.collection('users');
const collectionArray = [];
collectionRef.get()
.then((snapshot) => {
snapshot.forEach((doc) => {
let withId = {
docId: doc.id,
...doc.data(),
};
collectionArray.push(withId);

storageRef.child(`${doc.id}/avatar.jpg`).getDownloadURL().then((url) => {
withId = {
...withId,
avatarUrl: url,
};
collectionArray.push(withId);
});
});
return dispatch({
type: actionTypes.DONE,
data: collectionArray,
});
})

我有一个 promise ,但事情似乎进展并不顺利。

有什么想法吗?

最佳答案

让我们尝试一下

const collectionRef = dbf.collection('users');
const storageRef = /*...*/

// getAvatarUrl :: String -> Promise String
const getAvatarUrl = userId =>
storageRef
.child(`${userId}/avatar.jpg`)
.getDownloadURL()

// addDocIdAndAvatar :: Doc -> Promise {docId, ...docData, avatarUrl}
const addDocIdAndAvatar = async doc => ({
docId: doc.id,
...doc.data(),
avatarUrl: await getAvatarUrl(doc.id)
});

// collectUsersFromSnapshot :: Snapshot -> Dispatch
const collectUsersFromSnapshot = await snapshot =>
dispatch({
type: actionTypes.DONE,
data: await Promise.all(snapshot.map(addDocIdAndAvatar)),
});

collectionRef.get()
.then(collectUsersFromSnapshot)

通过对 addDocIdAndAvatar 使用 async 函数,我们可以等待 avatarUrl。类似地,在 collectUsersFromSnapshot 中,我们首先使用 Promise addDocIdAndAvatar 映射快照中的用户集合,然后使用 Promise.all >await 将整个 Promise 集合解析为一个解析数组,然后将其传递给 dispatch

如果您的设置禁止现代 JS 功能,例如 async 函数,您可以使用等效的流畅版本:

const collectionRef = dbf.collection('users');
const storageRef = /*...*/

// getAvatarUrl :: String -> Promise String
const getAvatarUrl = userId =>
storageRef
.child(`${userId}/avatar.jpg`)
.getDownloadURL()

// addDocIdAndAvatar :: Doc -> Promise {docId, ...docData, avatarUrl}
const addDocIdAndAvatar = doc =>
getAvatarUrl(doc.id)
.then(avatarUrl => ({ docId: doc.id, ...doc.data(), avatarUrl }))

// dispatchUsers :: [User] -> Dispatch
const dispatchUsers = data =>
dispatch({ type: actionTypes.DONE, data })

// collectUsersFromSnapshot :: Snapshot -> Promise Dispatch
const collectUsersFromSnapshot = snapshot =>
Promise.all(snapshot.map(addDocIdAndAvatar))
.then(dispatchUsers)

collectionRef.get()
.then(collectUsersFromSnapshot)

关于javascript - 在同一个 promise 中将用户和头像 URL 相互链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52496811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com