等待一组可观察的订阅功能完成

时间:2017-01-15 19:33:02

标签: javascript typescript observable

我想使用返回可观察对象的对象方法转换并替换数组中的所有单词。我使用基于this answer的绑定来传递正确的值。

当所有订阅完成后,我想调用另一个名为task2()的函数。我该如何实现呢?

for(let word in this.words){
    var i = Object.keys(this.words).indexOf(word);

    this.convertor.get(this.words[i].value).subscribe( function (i, result) {
    this.words[i].value = result; 
  }.bind(this, i));
}

//task2() <--------- when all subscribe functions finished

2 个答案:

答案 0 :(得分:1)

this.words是什么类型的?如果它是一个数组,那么循环它们的项目会更容易......你正在做一些非常奇怪的事情......

另外,请考虑使用箭头功能以避免在任何地方使用bind(this)。它有助于读出代码。

您应该使用forkJoin

重写代码
let streams = [];
for(let i = 0; i<this.words.length; i++){
    streams.push(this.convertor.get(this.words[i].value));
}

Rx.Observable.forkJoin(streams).subscribe((result) => {
    // Here result is an array with the results, and it's sorted properly (The first result is from the first stream, and so on).
    for(let i=0; i<result.length; i++) {
        this.words[i].value = result[i];
    }

    task2();
});

答案 1 :(得分:0)

我的模板解决方案:生成函数,仅在N次调用后调用另一个函数(如Promise.all)

这样的事情:

&#13;
&#13;
setlocale (LC_TIME,"de_DE");
&#13;
&#13;
&#13;