连续执行动态创建的可观察数组
Execute dynamically created array of observables in series
我正在开发一个项目 (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;
}
我想执行一个系列中的所有可观察对象(forkJoin
似乎是 运行 并行执行 - 所以使用了 concat)。一旦执行了所有可观察对象,就想执行一些与数据库相关的代码。但似乎我在 'Completed' 块中的代码不会等待所有 Observables 完成。我怎样才能做到这一点?
提前致谢
使用 Observable.concat(ObservableArray)
只会展平数组并从 ObservableArray
一个接一个地发出每个 Observable。顺便说一句,使用 concat
的静态版本只有在有两个或更多参数时才有意义(参见 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-concat)。
相反,您可以迭代 Observable 数组并等待它们使用 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
我正在开发一个项目 (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;
}
我想执行一个系列中的所有可观察对象(forkJoin
似乎是 运行 并行执行 - 所以使用了 concat)。一旦执行了所有可观察对象,就想执行一些与数据库相关的代码。但似乎我在 'Completed' 块中的代码不会等待所有 Observables 完成。我怎样才能做到这一点?
提前致谢
使用 Observable.concat(ObservableArray)
只会展平数组并从 ObservableArray
一个接一个地发出每个 Observable。顺便说一句,使用 concat
的静态版本只有在有两个或更多参数时才有意义(参见 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-concat)。
相反,您可以迭代 Observable 数组并等待它们使用 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