【发布时间】:2020-10-28 06:13:30
【问题描述】:
我学习了一些 React 和 Redux 并且有一个初学者问题。
在下面的 GitHub 代码中,有两个方法调用 getInitUsers() 和 getMoreUsers()。
Here is Original GitHub code for the below code
....
useEffect(() => {
const getUsers = async () => {
await getInitUsers();
}
getUsers();
}, [getInitUsers]);
const addMoreUsers = () => {
if(!isGettingMoreUsers) {
getMoreUsers(prevDoc);
}
}
....
const mapDispatchToProps = dispatch => ({
getInitUsers: () => dispatch(asyncGetInitUsers()),
getMoreUsers: prevDoc => dispatch(asyncGetMoreUsers(prevDoc))
})
...
上述getInitUsers()和getMoreUsers()的Redux动作是这两个:
Here is the original GitHub code for the below code
export const asyncGetInitUsers = () => {
return async dispatch => {
try {
dispatch(getUsersStart());
const usersRef = firestore.collection("users").orderBy("registrationDate", "desc").limit(30);
usersRef.onSnapshot(docSnapShot => {
let users = [];
docSnapShot.docs.forEach(doc => {
users.push({id: doc.id, data: doc.data()});
});
dispatch(getUsersSuccess(users));
const lastDoc = docSnapShot.docs[docSnapShot.docs.length - 1];
dispatch(setPrevDoc(lastDoc));
});
} catch (errorMsg) {
dispatch(getUsersFailure(errorMsg));
}
}
}
export const asyncGetMoreUsers = prevDoc => {
return async dispatch => {
try {
dispatch(getMoreUsersStart());
const usersRef = firestore.collection("users").orderBy("registrationDate", "desc").startAfter(prevDoc).limit(30);
usersRef.onSnapshot(docSnapShot => {
let users = []
docSnapShot.docs.forEach(doc =>{
users.push({id: doc.id, data: doc.data()})
});
dispatch(getMoreUsersSuccess(users));
const lastDoc = docSnapShot.docs[docSnapShot.docs.length - 1];
dispatch(setPrevDoc(lastDoc));
});
} catch (e) {
dispatch(getMoreUsersFailure(e));
}
}
}
我了解将getInitUsers() 放在useEffect() 中会使其在组件创建时运行一次。我想问的是这个await在这一行做了什么:
await getInitUsers();
如果您查看getMoreUsers(),它没有await,如果您查看asyncGetInitUsers() 和asyncGetMoreUsers() 以上两个动作,它们具有相同的逻辑并以:
return async dispatch => {...
那么这里有什么区别呢? getInitUsers() 和 getMoreUsers()??
我创建了一个CodeSandbox 来尝试理解await
【问题讨论】:
标签: reactjs redux async-await