系列

时间:2017-03-31 05:57:47

标签: javascript angular rxjs rxjs5

我正在开发一个项目(Angular2),我正在动态创建Observable并将它们放在一个数组中

var ObservableArray : Observable<any>[] = [];
//filling up Observable array dynamically
for (var i = 0; i < this.mainPerson.children.length; i++) {       
ObservableArray.push(Observable.fromPromise(this.determineFate(this.mainPerson.children[i])));
  }
}


var finalObservable: Observable<any> = Observable.concat(ObservableArray);

finalObservable
  .subscribe( data => {
    //here  I expected to execute determineFate() for all observables inside array  
    console.log("determine fate resolved data returned [" + data + "]");
  }, error => {
    console.error("error on Age Year for Characters")
  },() => {  
    //Here I expect this gets executed only when all Observables inside my array finishes 
    console.log("determine fate resolved data returned COMPLETED");
    //DB call
  });

  determineFate(..): Promise<boolean> {
       ...
       return either true / false if success or error;

 }

我想执行一系列中的所有observable(forkJoin似乎并行运行 - 所以使用concat)。一旦执行了所有可观察对象,就要执行一些与DB相关的代码。但似乎我的代码内部已完成&#39; block不等待所有Observables完成。我怎样才能做到这一点?

提前致谢

1 个答案:

答案 0 :(得分:2)

使用Observable.concat(ObservableArray)将展平数组并逐个从ObservableArray发出每个Observable。顺便说一句,使用concat的静态版本仅对两个或更多参数有意义(参见http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-concat)。

相反,你可以迭代Observables数组并等到它们与concatAll()运算符一个接一个地完成。

此示例模拟您的用例:

var observableArray = [];
// filling up Observable array dynamically
for (var i = 0; i < 10; i++) {
  observableArray.push(Observable.of('Value ' + i));
}

Observable.from(observableArray)
  .concatAll()
  .subscribe(console.log, null, () => console.log('completed'));

Observable.from()分别发出每个Observable,concatAll()按照发出的顺序订阅每个Observable。

此演示打印以控制以下输出:

Value 0
Value 1
Value 2
Value 3
Value 4
Value 5
Value 6
Value 7
Value 8
Value 9
completed