与Redux Saga并行运行多个受限任务

时间:2020-08-03 20:36:52

标签: reactjs redux redux-saga

问题: 我需要使用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)
}

0 个答案:

没有答案