在进行http调用angular2时,可以按顺序(或并行)触发可观察的火

时间:2017-03-10 05:10:56

标签: angular asp.net-web-api rxjs

我创建了一个可观察的“数组”,以及按顺序触发它们的内容(或者并行也可以完成这项工作)。

let listObservables: Observable<any>[]=[];

  for(let index of this.listIndexImagesToDelete){


    let obserToAdd = this.httpImageService.deleteImageInProductIdFolderFromContainer_imagesWysiwygProduct(
      this.arrayImagesInWysiwyg[index].productIdFolder, this.arrayImagesInWysiwyg[index].guid);

    listObservables.push(obserToAdd);

  }


  Observable.from(listObservables)
    .subscribe(
      (data: any)=> {
        console.log("[zr]Image deleted.");
      },
      (e:any) => {
        console.log('onError: %s', e);
      },
      () => {
        console.log('onCompleted');
        this.http_GetAllImagesInWysiwyg();
      }
    );

控制台日志打印:

//(取决于数组中的可观察数量,它将多次打印)

“[zr]图片已删除。”
这段代码没有异常,但后端的api永远不会被调用。为什么即使打印成功消息也没有任何反应(“[zr]图像被删除。”)??

2 个答案:

答案 0 :(得分:2)

您的Obervables永远不会被订阅,因此不会被解雇。

  • 如果要按顺序执行它们,则需要使用concat
Observable
  .concat(listObservables)
  .concatAll()
  .subscribe((data: any) => {
    console.log("[zr]Image deleted.", data);
  },
  (e:any) => {
    console.log('onError: %s', e);
  },
  () => {
    console.log('onCompleted');
    this.http_GetAllImagesInWysiwyg();
  }
);

工作演示:https://plnkr.co/edit/uG5jVzcOMxC7OuE4HQU3?p=preview

  • 如果您想一次解雇所有内容,请使用forkJoin

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

Observable
   .forkJoin(listObservables)
   .subscribe(resultArray => // will contain all results from your listObservables

将订阅所有Observable,“等待”直到完成并将结果合并为一个订阅。

答案 1 :(得分:0)

传递一组Observable作为参数:

Observable.concat(listObservables)

不起作用,因为(我的RXJS 5.0.3版本)没有传递数组的覆盖,因此它应该完成:

Observable.concat(listObservables[0],listObservables[1],listObservables[n])

要解决此问题,我们将使用spread operator 这就是语法糖(3点)......用于将每个数组项作为参数的单个项。

function myFunction(x, y, z) { }
var args = [0, 1, 2]; //from [0, 1, 2] to 0, 1, 2  
myFunction(...args);

因此工作函数调用应该是:

  Observable.concat(...listObservables) //<--**using SPREAD OPERATOR**
  .subscribe(
    (data: any)=> {
      console.log("[zr]Image deleted.");
      console.log("[zr]Image deleted. : data: ", data);

    },
    (e:any) => {
      console.log('onError: %s', e);
    },
    () => {
      console.log('onCompleted');
      this.http_GetAllImagesInWysiwyg();
    }
  );

本文提到了我的问题,处理其他rxjs函数:"Rx.Observable.merge is not accepting Array of Observables"