2017-01-07 26 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