如何向firestore发出ajax请求,接收数组并在redux-saga中为数组的所有项创建新请求?

时间:2018-01-11 17:11:10

标签: reactjs firebase redux google-cloud-firestore redux-saga

我想向 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 }
}

1 个答案:

答案 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));
}