【问题标题】:angular rxjs: handle multiple http requestsangular rxjs:处理多个 http 请求
【发布时间】:2021-05-26 19:29:44
【问题描述】:

我有以下伪代码

objects = [obj1, obj2, obj3]    
for obj in objects {
user: http.get(obj1.user_id)
product: http.get(obj1.product_id)
}.subscribe(results => {

do something with results

})

我在这里想要的是,我遍历一个对象数组,并为每个对象获取相关的用户和产品,然后订阅以对用户和产品做一些事情。我该怎么做?

【问题讨论】:

标签: angular rxjs observable


【解决方案1】:

您可以使用 RxJS forkJoinArray#map 来并行触发多个可观察对象。

const objects = [obj1, obj2, obj3];

forkJoin(
  objects.map(obj =>           // <-- `Array#map` function
    forkJoin({
      user: http.get(obj.user_id)
      product: http.get(obj.product_id)
    })
  )
).subscribe({
  next: (res) => {
    console.log(res);
    // use `res`
  },
  error: (err) => {}
});


/*
output in subscription: 
[
  { 
    user: result from `http.get(obj1.user_id)`,
    product: result from `http.get(obj1.product_id)`,
  },
  { 
    user: result from `http.get(obj2.user_id)`,
    product: result from `http.get(obj2.product_id)`,
  },
  { 
    user: result from `http.get(obj3.user_id)`,
    product: result from `http.get(obj3.product_id)`,
  }
]
*/

【讨论】:

  • 如何 console.log 里面的订阅结果?
【解决方案2】:

您可以使用zip() operator 组合您的请求并在每个请求完成后执行一些代码:

const sourceOne = http.get(obj1.product_id);
const sourceTwo = http.get(obj2.product_id);

zip(sourceOne, sourceTwo).subscribe(val => {
    // do something
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多