Javascript 如何使用RxJS发出多个HTTP请求,并将响应合并到一个负载中,并将其映射到另一个操作?
正如标题所述,我一直在试图找到一种方法,从一个操作负载发出多个HTTP调用,基本上将所有结果合并到一个数组中,然后将结果映射到另一个操作作为负载 这是我现有的代码,它可以工作,但它似乎没有合并两个响应,只关心请求响应的最后一个响应,也许我使用了错误的运算符,我只是拿起RxJS并尝试学习不同的东西,希望有人能够解释我的错误 非常感谢任何帮助或指导Javascript 如何使用RxJS发出多个HTTP请求,并将响应合并到一个负载中,并将其映射到另一个操作?,javascript,reactjs,rxjs,observable,rxjs6,Javascript,Reactjs,Rxjs,Observable,Rxjs6,正如标题所述,我一直在试图找到一种方法,从一个操作负载发出多个HTTP调用,基本上将所有结果合并到一个数组中,然后将结果映射到另一个操作作为负载 这是我现有的代码,它可以工作,但它似乎没有合并两个响应,只关心请求响应的最后一个响应,也许我使用了错误的运算符,我只是拿起RxJS并尝试学习不同的东西,希望有人能够解释我的错误 非常感谢任何帮助或指导 { type: 'FETCH_DATA', payload: { key: 'standings',
{
type: 'FETCH_DATA',
payload: {
key: 'standings',
value: [
'http://url-1',
'http://url-2'
],
})
}
// The epic is listening to the above action
const fetchDataEpic = action$ => action$.pipe(
ofType('FETCH_DATA'),
mergeMap(action => {
const { key, value } = action.payload;
if (Array.isArray(value) && value.length) {
const makeRequest = value.map((x, i) => ajax.getJSON(value[i]))
return (
forkJoin(
makeRequest,
response => {
return ({
type: 'FETCH_DATA_SUCCEEDED',
payload: {
key,
value: response,
},
})
}
)
)
}
})
);
注意:两个请求的响应都是相同的JSON格式,具有相同的属性,但数据不同
提前感谢看起来您正在使用rxjs的ajax函数,它应该已经为您提供了可观察性。在这种情况下,forkJoin应该在所有可观察对象发出值后将这两个值作为数组提供给您。然后,您可以使用map函数将其添加到动作负载中
constrequestarrays=[1,2].map(i=>{
返回rxjs.ajax.ajax.getJSON(`https://jsonplaceholder.typicode.com/posts/${i}`);
});
forkJoin(请求数组)
.烟斗(
rxjs.operators.tap(resp=>{
log(“第1部分:到目前为止的响应:”);
控制台日志(resp);
}),
rxjs.operators.map(值=>{
返回{
类型:“获取数据成功”,
有效载荷:{
价值
}
};
}),
rxjs.operators.tap(resp=>{
log('第2部分:作为操作负载的结果:');
控制台日志(resp);
}),
)
.subscribe()代码>
我不认为它只关心最后一个响应,而是第一个响应
这是因为如果您想自定义来自forkJoin
的响应,第二个(或者最后一个,如果第一个不是数组的话)参数(它是一个函数)接受多个参数,这些参数是来自所提供请求的响应
因此,这是为了获得整个响应数组而执行的更改
/**/
分叉连接(
提出请求,
(…响应)=>{
返回({
类型:“获取数据成功”,
有效载荷:{
钥匙
值:响应,
},
})
}
)
/*
编辑:将合并的响应发送到另一个操作
这可以通过使用操作符来实现,当您必须处理副作用时,通常使用该操作符
(
合并映射(操作=>{…}),
轻触(操作=>sendToOtherAction(操作))
)
Awesome,我现在可以在我的控制台中看到结果,但是它无法完成运行,下面是错误日志中的一条消息,`TypeError:You提供了一个无效的对象,其中需要一个流。您可以提供一个可观察的、承诺的、数组的或可观察的`当使用CDN中的RxJs时,建议销毁const map=RxJs.operators等函数;然后可以使用.pipe(map(val=>useVal(val)),我认为它使它更具可读性,并且与使用导入时的代码外观相匹配。@ZAD,您是否与我在“编辑”中的实现方式相同?如果单击“运行代码段”,您可以看到它给出了正确的结果,并且没有错误。@Cookie Stealer是的,奇怪的是,我遵循了完全相同的方法,但无法使其工作,它不可能是yo你的代码片段运行得很好,也许明天需要再看一遍,谢谢你的帮助:)@ZAD,如果你明天还不能弄清楚,请随时发布你的实现,我可以查看一下,看看有什么问题。谢谢你的回复,它可以工作,但我仍然看到与以前相同的结果,但是使用spread操作符并没有太大的改变,所以您试图实现的是在收到合并响应后发送另一个操作,对吗?通过“合并”,我理解它们被分组到一个数组中。剩下的是发送另一个操作,对吗?是的,假设我们有2个ajax调用,进行两个调用,成功后将两个响应合并到单个数组中,并将其作为有效负载发送到另一个操作。谢谢:)将重试