问题: 我需要使用redux saga将100个创建用户请求发送到rest api。
例如,如果我需要使用USER_CREATE_USERS redux操作创建5个用户,我想一次发送3个并行创建用户请求。
让用户= [用户1,用户2,用户3,用户4,用户5],我想一次发送针对[用户1,用户2,用户3]的创建请求。
如果任何一个创建请求完成(成功或失败),我就会从阵列中拉出另一个请求。
假设user1已完成,所以我可以拉出user4,正在进行的任务将是[user2,user3,user4]。
我发现我可以使用一些redux saga效果, 全部->不适用于我,因为我不想等待所有正在进行的任务都完成以移至下一个任务。 race->如下面的代码所示,对于进行中的分叉任务不会产生作用。
有什么办法可以实现这一目标?有关详细信息,我在下面有一个示例:
function* rootUserSaga{
takeLatest('USER_CREATE_USERS', createUsersSaga)
}
interface IUser{
id : String;
name : String;
}
interface ICreateUsersAction{
type : String;
users : Array<IUser>
}
function* createUsersSaga(action : ICreateUsersAction){
yield call(createUsersInParallel, action.users);
yield put({type : 'USER_CREATE_USERS_SUCCESS'})
}
const getRunningTasksCount = tasks => tasks.filter(task => task.isRunning()).length;
const singleTimeCreateUsersLimitCount =3;
function* createUsersInParallel(users : Array<IUser>){
const inProgressTasks = [];
for (let index = 0; index < users.length; index++) {
const task = yield fork(createUser, users[index])
if(getRunningTasksCount(inProgressTasks) >= singleTimeCreateUsersLimitCount){
yield race([...inProgressTasks]) //wait here till any of the in progress task completed or cancelled
}else{
inProgressTasks.push(task)
}
}
}
function* createUser(user : IUser){
//Request to create api
//yield call('localhost://user/create', user)
}