• 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)
}