为什么我不能在 Redux-Saga 的 for..in 循环中使用嵌套的 yield [英] Why can't I use nested yield in for..in loop in Redux-Saga
问题描述
所以我有带有 ID 和值的 tasks
对象.使用 for in 循环,我想读取成员"属性.如果它存在,并且数组的第一个元素 !=='all'
我想通过给定的 id 向 firebase 发出请求以读取文档.但是我不能使用yield
,出现错误:
So I have tasks
object with ids and values. With for in loop I want to read 'members' property. If it exist, and first element of array !=='all'
I want to make request to firebase for read document by given id. But I cant use yield
, there is error:
Failed to compile.
./src/containers/modules/Tasks/store/sagas/tasksSagas.js
Line 27: Parsing error: Unexpected reserved word 'yield'
为什么我会得到它?我不能使用嵌套收益?
Why am I getting it? I can't use nested yields?
//Fetching users for tasks
for (const task in tasks) {
if (tasks[task].hasOwnProperty('members')) {
if (tasks[task].members[0]==='all'){
tasks[task].fetchedMembers = ['all']
}
else {
const fetchedMembers = tasks[task].members.map(member => {
const user = yield db.collection('users').doc(member).get()
const userData = user.data()
return {
uid: member,
...userData
}
})
tasks[task].fetchedMembers = fetchedMembers
}
}
}
推荐答案
const fetchedMembers = tasks[task].members.map(member => {
const user = yield db.collection('users').doc(member).get()
const userData = user.data()
return {
uid: member,
...userData
}
})
您传递给 .map
的函数不是生成器函数,因此您不能在其中使用 yield
.并且它不能是生成器函数,因为 map
对生成器或传奇一无所知.
The function you pass to .map
is not a generator function, so you can't use yield
in it. And it can't be a generator function, since map
knows nothing about generators or sagas.
一个选择是创建一个 promise 数组,然后产生它(或者包裹在 Promise.all 中,或者 redux-saga 的 all effect):
One option is to create an array of promises, and then yield that (either wrapped in Promise.all, or redux-saga's all effect):
const promises = tasks[task].members.map(member => {
return db.collection('users').doc(member).get();
})
const members = yield all(promises);
const fetchedMembers = members.map(user => {
const userdata = user.data();
return {
uid: member,
...userData;
}
);
另一种选择是为每个成员编写一个你想要做的迷你传奇,然后创建一个调用效果数组,然后产生所有这些:
Another option is to write a mini-saga you want to do for each member, and then create an array of call effects, then yield all of those:
const callEffects = tasks[task].members.map(member => {
return call(function* () {
const user = yield db.collection('users').doc(member).get()
const userData = user.data()
return {
uid: member,
...userData
}
});
})
const fetchedMembers = yield all(callEffects);
这篇关于为什么我不能在 Redux-Saga 的 for..in 循环中使用嵌套的 yield的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!