Параллельное выполнение нескольких ограниченных задач с Redux Saga - PullRequest
0 голосов
/ 03 августа 2020
• 1000 запрос за один раз.

let users = [user1, user2, user3, user4, user5], я хочу отправить запрос на создание для [user1, user2, user3] за один раз.

Если какой-либо из запросов на создание завершен (успешно или неудачно), я извлекаю другой из массива.

допустим, что user1 завершен, поэтому я могу вытащить user4, и выполняемые задачи будут [user2, user3, user4].

Я обнаружил, что есть некоторые эффекты саги о сокращении, которые я могу использовать, все -> у меня не сработало, потому что я не хочу ждать, пока будут выполнены все текущие задачи перейти к следующему. 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)
}
...