2017-01-15 91 views
0

我想使用返回可觀察對象的方法來轉換和替換數組中的所有單詞。我使用基於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 
+0

的可能的複製(http://stackoverflow.com/questions/35608025/promise-all-behavior -with-rxjs-observables) –

回答

1

什麼類型是this.words?如果它是一個數組,那麼它更容易循環他們的物品...你正在做的事情真的很奇怪...

此外,請考慮使用箭頭功能,以避免在任何地方使用bind(this)。它有助於讀出代碼。

你應該使用forkJoin重寫代碼:[?與RxJS觀測量Promise.all行爲]

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(); 
}); 
+0

不錯的建議!我只有一個擔心:這段代碼的運行時間與使用綁定的情況相比如何。看起來像你第一次推動一個數組(流)的一切。如果這個陣列太大了會怎麼樣? – Ari

+0

@Ari'bind'在內部返回一個函數,該函數將設置'this'並將任何參數傳遞給您定義的函數。由於我們不需要使用此解決方案的任何附加參數,並且可以使用箭頭函數設置「this」,所以我們不需要它。我不太確定使用數組的效果......測試/基準測試可能會很有趣。讓'.subscribe('進入一個巨大的重複循環也不太好。 – olivarra1

0

我的模板解決方案:生成功能,只有在N調用(如Promise.all)

像這樣調用另一個函數:

function onlyNthCall(callCount, callback) 
 
    { 
 
    var callIter = 0; 
 
    return function() 
 
     { 
 
     callIter++; 
 
     if(callIter === callCount) { callback(); } 
 
     } 
 
    } 
 
var task2AfterLastCall = onlyNthCall(Object.keys(this.words).length, 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; 
 
    task2AfterLastCall(); 
 
    }.bind(this, i)); 
 
}