Javascript 如何创建可附加的可观察队列?
我有一个数组,需要使用该数组的单个数据集发出单个请求。我发现很难解决的问题是安排电话。意味着,只有当一个请求完成时,下一个请求才会开始。我正在寻找一个RxJs队列,但我无法简单地找到解决方案 例如:Javascript 如何创建可附加的可观察队列?,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我有一个数组,需要使用该数组的单个数据集发出单个请求。我发现很难解决的问题是安排电话。意味着,只有当一个请求完成时,下一个请求才会开始。我正在寻找一个RxJs队列,但我无法简单地找到解决方案 例如: function makeRequest(body): Observable<any> { return someAsyncRequest(body); } array.forEach((entry) => { makeRequest(entry); }); //
function makeRequest(body): Observable<any> {
return someAsyncRequest(body);
}
array.forEach((entry) => {
makeRequest(entry);
});
// This is just an example how the setup is. This code does not work.
// What I need is a queue like feature in RxJs to append requests and wait before the previous one is finished.
函数makeRequest(body):可观察{
返回请求(正文);
}
array.forEach((条目)=>{
发出请求(输入);
});
//这只是一个设置的示例。此代码不起作用。
//我需要的是RxJs中类似队列的特性,用于追加请求并在前一个请求完成之前等待。
ForkJoin可以满足您的要求
“forkJoin”等待每个HTTP请求完成,并将每个HTTP调用返回的所有可观察对象分组到单个可观察数组中,最后返回该可观察数组
public requestDataFromMultipleSources(): Observable<any[]> {
let response1 = this.http.get(requestUrl1);
let response2 = this.http.get(requestUrl2);
let response3 = this.http.get(requestUrl3);
return forkJoin([response1, response2, response3]);
}
看这一点,你可以做到,即使没有观察到
Promise.all(array.map(item => makeRequest(item))).then(values =>{
// your logic with recieved data
})
你有很多选择,但我认为
concat
或forkJoin
最适合你concat
仅在上一次完成后调用第二个API,而forkJoin
将执行相同的操作,但前提是它们都没有错误。如果其中有任何错误,它将不会返回任何内容
带有concat
的示例:
concat(...array.map(entry => makeRequest(entry)).subscribe()
p、 s.导入concat
作为静态运算符:
import { concat } from 'rxjs'
如果你想让事情一个接一个地进行,但仍然能同时收到所有结果,我建议concat->reduce。看起来像这样:
concat(...array.map(entry => makeRequest(entry))).pipe(
reduce((completed, curResponse) => completed.concat([curResponse]), [])
).subscribe(allResponses => console.log(allResponses))
这种结构实现了forkjoin将提供给您的单一发射,但会一个接一个地执行请求,然后在所有请求完成后收集它们。如果您希望结果一个接一个地完成,那么只需concat就可以完成其他人显示的工作似乎它不保留顺序,也不等待任何请求。例如,我有5000个项目,我想提出一个1乘1的请求。哦,好的,得到了您实际尝试的内容。我尝试一个接一个地接收响应,并且以与我在数组中的数据相同的顺序接收响应。Promise的一个有趣的事情是,Promise的顺序得到了维护。从…起
concat(...array.map(entry => makeRequest(entry))).pipe(
reduce((completed, curResponse) => completed.concat([curResponse]), [])
).subscribe(allResponses => console.log(allResponses))