2017-01-07 24 views
0

海蘭所有,即時通訊已經詢問從rxjs聯合運營...例子在JavaScript

我有位點陣列:

const sites = [ 
    { name:'siteOne', url: 'http://www.example.com' }, 
    { name:'siteTwo', url: 'http://www.google.com' }, 
    { name:'siteThree', url: 'http://www.google.com' } 
    ] 

所以,我不想讓每個請求時間,但我需要讓每個網站的網址一個請求,不是做出新的數據流,與網站相結合,這樣的:

[ html, siteTwo, siteThree] 
[ html, siteOne ] 

任何方式做到這一點?謝謝

回答

1

如果你想只取一次數據的每一個獨立的網址,你可以做這樣的事情:

Rx.Observable.from(sites) 
    .groupBy(s => s.url) 
    .flatMap(grp => grp.toArray()) 
    .flatMap(
    uniqueUrlGrouping => fetchHtml(uniqueUrlGrouping[0].url), 
    (uniqueUrlGrouping, html) => ({ 
     url: uniqueUrlGrouping[0].url, 
     sites: uniqueUrlGrouping.map(s => s.name), 
     html:html 
    }) 
) 
    .subscribe(val => console.log(val)); 

注意;爲toArray()工作您的輸入流需要完成,否則它不知道它什麼時候可以將完成的分組發射轉換爲數組。

請注意,.groupBy()將在內存中保留所有唯一的url,直到您的輸入流完成,因此如果您的輸入流是無限的,它可能會增長到很大的內存使用率。

+0

謝謝!這是一個很好的例子,如何使用投影功能 – huadev