Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用RxJS发出多个HTTP请求,并将响应合并到一个负载中,并将其映射到另一个操作?_Javascript_Reactjs_Rxjs_Observable_Rxjs6 - Fatal编程技术网

Javascript 如何使用RxJS发出多个HTTP请求,并将响应合并到一个负载中,并将其映射到另一个操作?

Javascript 如何使用RxJS发出多个HTTP请求,并将响应合并到一个负载中,并将其映射到另一个操作?,javascript,reactjs,rxjs,observable,rxjs6,Javascript,Reactjs,Rxjs,Observable,Rxjs6,正如标题所述,我一直在试图找到一种方法,从一个操作负载发出多个HTTP调用,基本上将所有结果合并到一个数组中,然后将结果映射到另一个操作作为负载 这是我现有的代码,它可以工作,但它似乎没有合并两个响应,只关心请求响应的最后一个响应,也许我使用了错误的运算符,我只是拿起RxJS并尝试学习不同的东西,希望有人能够解释我的错误 非常感谢任何帮助或指导 { type: 'FETCH_DATA', payload: { key: 'standings',

正如标题所述,我一直在试图找到一种方法,从一个操作负载发出多个HTTP调用,基本上将所有结果合并到一个数组中,然后将结果映射到另一个操作作为负载

这是我现有的代码,它可以工作,但它似乎没有合并两个响应,只关心请求响应的最后一个响应,也许我使用了错误的运算符,我只是拿起RxJS并尝试学习不同的东西,希望有人能够解释我的错误

非常感谢任何帮助或指导


{
    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调用,进行两个调用,成功后将两个响应合并到单个数组中,并将其作为有效负载发送到另一个操作。谢谢:)将重试