Rxjs 可观察多次发出请求并一起收集响应

Rxjs 可观察多次发出请求并一起收集响应,rxjs,observable,redux-observable,Rxjs,Observable,Redux Observable,在数据库中,我有19个用户。 在我的API中,一次调用只能得到5个结果 如果我想得到所有这些,我需要做4次请求,每次获得5个用户。使用startquery,我将更改希望新用户获得的位置 我正试图在RxJS和redux observable中实现这一点。 我有一些想法,但也许我的方法是强制性的,而RxJS是相反的意识形态 //从API和'pipe'获取用户,他们帮助我查看实际数据并计算数组长度 函数getUsers(位置=0){ 返回ajax.getJSON(`${API}/users?\u s

在数据库中,我有19个用户。 在我的API中,一次调用只能得到5个结果

如果我想得到所有这些,我需要做4次请求,每次获得5个用户。使用
start
query,我将更改希望新用户获得的位置

我正试图在RxJS和redux observable中实现这一点。 我有一些想法,但也许我的方法是强制性的,而RxJS是相反的意识形态

//从API和'pipe'获取用户,他们帮助我查看实际数据并计算数组长度
函数getUsers(位置=0){
返回ajax.getJSON(`${API}/users?\u start=${position}&\u limit=5`)。
管道(映射({data})=>({responseLength:data.length,data})))
}
//在这里,当我得到array.lenght等于5的响应时,我知道我需要再次执行数据获取。
//这里遇到的问题是:如果我在执行递归之后执行递归,我将只得到最后一个结果,而不是两个结果,
//若我把我以前的结果放入数组,然后递归结果再次推入数组,那个么之后它就变得太复杂了
//在userFetchEpic中,使用此数据进行操作
函数计数(数据){
返回数据.pipe(
地图(项目=>{
如果(item.responseLength==5){
计数(getUsers(5));
}
返回{type:“TEST”,item}
})
)
}
函数userFetchEpic(操作$){
返回动作$
.烟斗(
ofType(用户获取),
合并映射(()=>{
返回计数(getUsers()).pipe(
映射(i=>i)
)
})
);
}
19个用户,有4个并发呼叫 我已经重新安排了get users函数来生成4个Ajax调用,同时运行它们,然后将结果平铺到一个数组中。这将使您在单个阵列中获得所有19个用户

function getUsers() {
  return forkJoin(
    [0,5,10,15].map(position => 
      ajax.getJSON(`${API}/users?_start=${position}&_limit=5`)
    )
  ).pipe(
    map(resArray => resArray.flatMap(res => res.data))
  )
}

function userFetchEpic(action$) {
  return action$.pipe(
    ofType(USER_FETCH),
    mergeMap(_ => getUsers())
  );
}
泛化:递归地获取用户 这将再次返回所有19个用户,但这次您不需要提前知道您有19个用户。另一方面,它会按顺序进行所有调用,所以我希望它会慢一些

你会注意到这一步是递归完成的。您正以这种方式创建一个调用堆栈,但只要您没有数百万用户,就不会有问题

function getUsers(position = 0) {
  return ajax.getJSON(`${API}/users?_start=${position}&_limit=5`).pipe(
    switchMap(({data}) => 
      data.length < 5 ?
      of(data) :
      getUsers(position + 5).pipe(
        map(recursiveData => data.concat(recursiveData))
      )
    })
  );
}
函数getUsers(位置=0){ 返回ajax.getJSON(`${API}/users?\u start=${position}&\u limit=5`)。管道( 开关映射({data})=> 数据长度<5? (数据): getUsers(位置+5)。管道( map(recursiveData=>data.concat(recursiveData)) ) }) ); } 19个用户,有4个并发呼叫 我已经重新安排了get users函数来生成4个Ajax调用,同时运行它们,然后将结果平铺到一个数组中。这将使您在单个阵列中获得所有19个用户

function getUsers() {
  return forkJoin(
    [0,5,10,15].map(position => 
      ajax.getJSON(`${API}/users?_start=${position}&_limit=5`)
    )
  ).pipe(
    map(resArray => resArray.flatMap(res => res.data))
  )
}

function userFetchEpic(action$) {
  return action$.pipe(
    ofType(USER_FETCH),
    mergeMap(_ => getUsers())
  );
}
泛化:递归地获取用户 这将再次返回所有19个用户,但这次您不需要提前知道您有19个用户。另一方面,它会按顺序进行所有调用,所以我希望它会慢一些

你会注意到这一步是递归完成的。您正以这种方式创建一个调用堆栈,但只要您没有数百万用户,就不会有问题

function getUsers(position = 0) {
  return ajax.getJSON(`${API}/users?_start=${position}&_limit=5`).pipe(
    switchMap(({data}) => 
      data.length < 5 ?
      of(data) :
      getUsers(position + 5).pipe(
        map(recursiveData => data.concat(recursiveData))
      )
    })
  );
}
函数getUsers(位置=0){ 返回ajax.getJSON(`${API}/users?\u start=${position}&\u limit=5`)。管道( 开关映射({data})=> 数据长度<5? (数据): getUsers(位置+5)。管道( map(recursiveData=>data.concat(recursiveData)) ) }) ); } 您可以使用!?你可以用!?