javascript - 多个 RxJS AJAX 请求

标签 javascript ecmascript-6 rxjs reactive-programming

我正在使用 rxjs 发出多个 http 请求,我希望最终得到一个如下所示的对象:

{
  100: {
    ...response from api call...
  },
  205: {
    ...response from api call...
  },
  ...etc...
}

这是我到目前为止所拥有的:

const projectIds = [100, 205, 208, 300]
const source = Rx.Observable
  .from(projectIds)
  .flatMap(id => get(`projects/${id}/builds`))
  .map(response => response['data'])
  .zip(projectIds)
  .toArray()

source.subscribe(pipelines => {
  console.log(pipelines)
})

这会返回一个数组,其中第一个元素是调用的响应,第二个元素是项目的 id。

问题是响应与项目 ID 不匹配,因为响应以不同的顺序返回,具体取决于哪个请求首先完成。

如何保留顺序(或者至少知道每个响应对应哪个projectId),同时最后还得到一个对象(当前是一个数组)?

最佳答案

选项 1

您可以使用 concatMap 代替 flatMap ,这应该保留顺序。

注意:如果您正在寻找的话,这不会发出任何并发请求。

<小时/>

选项 2

如果您想发出并发请求(至少从 RxJS 端,根据浏览器,这可能仍然受到限制),您可以使用 forkJoin 来使用一些构造,如下所示:

const projectIds = [100, 205, 208, 300]
const source = Rx.Observable
  .from(projectIds)
  .map(id => get(`projects/${id}/builds`).pluck('data'))
  .toArray()
  .switchMap(requestArray => Rx.Observable.forkJoin(requestArray))
  .zip(projectIds)


source.subscribe(pipelines => {
  console.log(pipelines)
})

关于javascript - 多个 RxJS AJAX 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793042/

相关文章:

Javascript addEventListener 以某种方式无法在 Laravel 中使用 querySelector

javascript - 如何摆脱数字属性的自动排序?

javascript - 如何让 async/await 等待 Observable 返回

angular - 同步函数 - 在 Angular 中

javascript - 将可观察对象的一部分作为输入传递给 Angular 分量时出错?

java - 按位非运算符

javascript - 水平翻转html网页而不是文本

java.lang.NoSuchFieldError : reportUnusedDeclaredThrownExceptionIncludeDocCommentReference 错误

javascript - 使用 ES6 模板的带有链接的文本

javascript - React中setState增量和每次增量1有什么区别