Javascript 如何创建可附加的可观察队列?

Javascript 如何创建可附加的可观察队列?,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我有一个数组,需要使用该数组的单个数据集发出单个请求。我发现很难解决的问题是安排电话。意味着,只有当一个请求完成时,下一个请求才会开始。我正在寻找一个RxJs队列,但我无法简单地找到解决方案 例如: function makeRequest(body): Observable<any> { return someAsyncRequest(body); } array.forEach((entry) => { makeRequest(entry); }); //

我有一个数组,需要使用该数组的单个数据集发出单个请求。我发现很难解决的问题是安排电话。意味着,只有当一个请求完成时,下一个请求才会开始。我正在寻找一个RxJs队列,但我无法简单地找到解决方案

例如:

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))