我想向 firestore 发出api请求以接收一组用户。
该数组包含 DocumentSnapshot ,用于成绩集合
我需要先发出请求,当我收到用户时,我需要为每个用户再发一个请求,因为我需要收集所有数据并将其放到redux存储中。
function* getUsers() {
const querySnapshot = yield firebaseDB.collection('users').where('type', '==', 'pupil').get();
const users = yield all(querySnapshot.docs.map((userData) => {
const user = userData.data();
user.id = userData.id;
//the problem on the next line
user.grade = call(getGradeFromUser, user);
return user;
}));
yield put(getAllUsersSuccess(users));
}
function* getGradeFromUser(user) {
yield call(user.grade.get).then(grade => grade.data());
}
export default function* usersFlow() {
yield takeEvery(UsersActionTypes.GET_ALL_USERS_REQUEST, getUsers);
}
我可以收到一组用户,但是我无法从每个用户那里收到 DocumentSnapshot 的成绩信息。 如何让它们并行运行并在最后一个解决后,将它们发送到redux商店? 也许有更好的方法来解决这个问题?
用户对象如下所示:
{
fullName: "Alex Smith",
type: "pupil",
grade: DocumentSnapshot {_firestore: Firestore, _key: DocumentKey, _document: Document, _fromCache: false }
}
答案 0 :(得分:0)
您需要使用一系列效果调用all
。目前你正在使用包含效果的对象数组进行调用(但是redux-saga不知道这一点)。
要解决此问题,请务必先构建一系列效果,然后将其传递给all()
,然后使用结果构建您的用户列表:
function* getUsers() {
const querySnapshot = firebaseDB.collection('users').where('type', '==', 'pupil').get(); // no need to yield this
const effects = querySnapshot.docs.map(userData => call(getGradeFromUser, user));
const grades = yield all(effects)
const users = querySnapshot.docs.map((userData, index) => {
const user = userData.data();
user.id = userData.id;
// We can get this user's grade from the pre-computed list of grades
user.grade = grades[index];
return user;
});
yield put(getAllUsersSuccess(users));
}