2016-11-04 14 views
0

RxJs,Typescript 1.8和Angular2。RxJs:分别发出序列的每个值

我有一个函数返回一个Observable。 Observable调用一个web API,它返回一系列对象。这里是我的实际代码:

getClients(): Observable<IClient[]> { 
    return this.backendService.get(`tracker/clients`) 
     .map((resp: {}[]) => { return _.map(resp, createClientFromJson)}) 
     .map((clients: IClient[]) => { 
     this.logger.debug(`Created ${clients.length} Clients from reply`); 
     return clients; 
     }); 
    } 

backendService.get()调用最终调用http.get(),它返回一个Observable

而且我的代码消耗从可观察的事件:

loadClients() { 
    this.getClients().subscribe((clients: IClient[]): void => { 
     this.clients = this.clients.concat(clients); 
     this.logger.debug(`Got ${clients.length} clients, now have ${this.clients.length}.`); 
    }) 
    } 

这一切工作。然而,我的Observable发出一个单一的时间 - 有N个元素的序列。如果Web API返回20个项目的序列,则只有1个事件将发送到。

我该如何做到让序列中的每个项目都是自己发射,而不是一次发射整个序列?

在我的程序的某些部分,我需要整个序列。在其他人中,我需要寻找符合某些标准的特定元素。

回答

1

尝试这种

this.getClients().flatMap(clients => Observable.from(clients)).subscribe(client => { 
    // do something with client 
}) 
+0

这个结果在'可观察'或一个'可观察<可观察>'?我问,因为我沿着这些路线尝试了一些东西,但它导致了可观察到的可观察的情况,这很难处理。 –

+2

只要做'flatMap(clients => clients)' –

+0

我最终用'flatMap(clients => clients)',而不是'Observable.from(...)' –

2
this.getClients().switch(v => v).subscribe(clients => { 
    // your original code 
}); 
请问
+1

这很好理解,但是在我的用例我正在实现一个函数'getEachClient()',它应该单独发射每个'IClient'。使用'switch'将会(似乎)导致每个IClient被它自己的1元素序列发射。使用'flatMap'似乎更适合我的用例。 –