Rxjs 可观察多次发出请求并一起收集响应
在数据库中,我有19个用户。 在我的API中,一次调用只能得到5个结果 如果我想得到所有这些,我需要做4次请求,每次获得5个用户。使用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
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))
)
})
);
}
您可以使用!?你可以用!?