【问题标题】:Angular 2 : merge several http calls into oneAngular 2:将几个 http 调用合并为一个
【发布时间】:2017-09-24 00:55:37
【问题描述】:

我有一个用于上传图片的服务。要上传图片,我要做的就是

return this.http.post(/* ... */)

并且我获得了可以在我的组件中订阅的订阅。但是当我想上传几张图片时,我必须这样做

for (let p of pics) { this.http.post(/* ... */); }

我的问题是我想返回所有调用的结果,而不是只返回一个调用。那可能吗 ?

编辑这是我的服务

addPictures(files: File[], folder: string): Observable<Parse.Object[]> {
  let hasError = false;
  for (let file of files) {
    let [type, ext] = file.type.split('/');
    if (type.toLowerCase() !== 'image' || !environment.imgExts.includes(ext.toLowerCase())) { hasError = true; }
  }
  if (hasError) { return Observable.throw('Invalid extension detected'); }

  let observables: Observable<Parse.Object>[] = [];

  for (let file of files) {
    // Get its size
    let img = new Image();
    img.onload = () => {
      // Create the Parse document
      let parseImg = { url: '', type: file.type, width: img.width, height: img.height };
      // Upload it on Amazon and add it to DB
      observables.push(this.addPicture(parseImg, file, folder));
    }
    img.src = window.URL.createObjectURL(file);
  }
  return Observable.forkJoin(observables);
}

【问题讨论】:

标签: angular rxjs observable


【解决方案1】:

如果您想并行运行所有请求,您可以使用forkJoin()

const observables = pics.map(p => this.http.post(/* ... */));

Observable.forkJoin(observables)
  .subscribe(results => ...);

您最终可以使用Observable.merge() 在结果到达时接收结果,或者最终使用Observable.concat() 一个接一个地调用请求。

【讨论】:

  • 这是完全正确的,但它不是你所欣赏的骗局吗?您可以按照元论坛的建议在欺骗问题下提供答案:/
  • 好吧,我不知道,我正在测试重复评论中给出的溶液(但它看起来很像你的)。我为什么要使用 Observable.merge ?我在问如何合并。 Forkjoin 不会自动合并?
  • @trichetriche 因为forkJoin() 仅在所有 Observables 完成后才会发出。但是merge 会立即从每个 Observable 中发出每个项目。
  • 哦,我明白了,这意味着在我的订阅中我将有一个订阅表,而 merge 将只有一个?
  • 准确地说是订阅数组,但是是的。
猜你喜欢
  • 1970-01-01
  • 2017-10-03
  • 2021-09-22
  • 2020-06-11
  • 2013-08-22
  • 2017-11-25
  • 2019-10-03
  • 2019-11-24
  • 1970-01-01
相关资源
最近更新 更多