Angular 2:将几个http调用合并为一个

时间:2017-07-25 11:20:25

标签: angular rxjs observable

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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