Javascript 等待一组可观察的订阅函数完成

Javascript 等待一组可观察的订阅函数完成,javascript,typescript,observable,Javascript,Typescript,Observable,我想使用返回可观察值的对象方法转换和替换数组中的所有单词。我使用基于的绑定来传递正确的值 当所有订阅完成后,我想调用另一个名为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.w

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

当所有订阅完成后,我想调用另一个名为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

我的模板解决方案:generate函数,它只在N次调用之后调用另一个函数,比如Promise.all

大概是这样的:

函数onlynthCallCount,callback { var-callIter=0; 返回函数 { callIter++; ifcallIter===callCount{callback;} } } var task2AfterLastCall=onlyNthCallObject.keyshis.words.length,task2; 这句话里的forlet字{ var i=Object.keyshis.words.indexOfword; this.convertor.getthis.words[i].value.subscribe函数i,result{ this.words[i].value=result; 任务2上次通话后; }.这个,我; } 这是什么类型的?如果它是一个数组,那么就更容易在它们的项目上循环。。。你在做一些非常奇怪的事情

也可以考虑使用箭头函数来避免使用BDITCH。它有助于读取代码

您应该使用forkJoin重写代码:


可能重复的好建议!我只关心一个问题:这段代码的运行时与使用bind的情况相比如何。似乎您首先将所有内容推送到一个数组流中。如果这个数组太大怎么办?@Ari bind在内部返回一个函数,该函数将设置这个数组,并将任何参数传递给您定义的函数。由于使用此解决方案不需要任何额外的参数,并且可以使用箭头函数进行设置,所以我们不需要它。我不太确定使用数组的效果。。。对其进行测试/基准测试可能会很有趣。让.subscribe进入一个巨大的重复循环也不太好。
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();
});