【问题标题】:Execute dynamically created array of observables in series连续执行动态创建的可观察数组
【发布时间】:2017-08-25 07:06:13
【问题描述】:

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

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;

 }

我想执行一系列的所有 observables(forkJoin 似乎并行运行 - 所以使用 concat)。一旦所有的 observables 都被执行,想要执行一些 DB 相关的代码。但似乎我在“已完成”块中的代码并没有等待所有 Observables 完成。我怎样才能做到这一点?

提前致谢

【问题讨论】:

  • 我不明白forkJoin 在这种情况下怎么没用。 forkJoin 将完成所有可观察的事情。然后你可以运行你的数据库查询。这不是你想要的吗?
  • determineFate() 使用了一些被并行线程覆盖的“this”变量。我已经尝试过 forkJoin() 但由于上述问题,需要依次执行。

标签: javascript angular rxjs rxjs5


【解决方案1】:

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

相反,您可以使用 concatAll() 运算符迭代 Observable 数组并等待它们一一完成。

此示例模拟您的用例:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2020-04-02
    相关资源
    最近更新 更多