0

filter()オブザーバブルをフィルタリングするために演算子を使用する最もクリーンなソリューションを見つけようとしています。

femaleListここでは、個別に取得するサービス コールを複製しています。

export class MyComp implements OnInit {

    maleList: IContact[] = [];
    femaleList: IContact[] = [];    

    constructor(private _contactService: ContactService) { }
    ngOnInit() : void {
        this._contactService.getContacts()
         .filter(male => male.gender === 'M')
        subscribe(maleList => this.maleList = maleList);

        this._contactService.getContacts()
         .filter(female => female.gender === 'F')
        subscribe(femaleList => this.femaleList = femaleList);
     } }

連絡先リスト

 [{
      "id" : 1,
      "name" : "Todd",
      "gender" : "M"
    }, {
      "id" : 2,
      "name" : "Lillian",
      "gender" : "F"
    }]

2 つの変数に割り当てる単一のオブザーバブルを持つ RxJS 演算子にオプションはありますか。

連絡先をフィルタリングしてRxJSmaleListオペレーターに割り当て、femaleList使用するにはどうすればよいですか。 filter()

前もって感謝します

4

3 に答える 3

2

フィルターは必要ありません:

this._contactService.getContacts()
  .subscribe(person => {
    if(person.gender === 'F'){
      this.femaleList.push(person);
    } else {
      this.maleList.push(person);
    }
于 2016-12-13T12:56:59.923 に答える
1

share()単一の Observable を使用し、2 つの異なる Observers でそれをサブスクライブする場合は、 orを使用する必要がありますshareReplay()(RxJS 5 では現在 でのみ使用可能です.publishReplay().refCount()) ( https://github.com/Reactive-Extensions/RxJS/を参照) blob/master/doc/api/core/operators/publish.mdおよびhttps://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharereplay.md )。

let data = [{
    "id" : 1,
    "name" : "Todd",
    "gender" : "M"
}, {
    "id" : 2,
    "name" : "Lillian",
    "gender" : "F"
}];

let maleList = [];
let femaleList = [];

let source = Observable.defer(() => {
        console.log('Observable.defer');
        return Observable.from(data);
    })
    .publishReplay()
    .refCount();

source
    .filter(male => male.gender === 'M')
    .toArray()
    .subscribe(list => maleList = list);

source
    .filter(male => male.gender === 'F')
    .toArray()
    .subscribe(list => femaleList = list);

console.log('maleList', maleList);
console.log('femaleList', femaleList);

ライブデモを見る: https://jsbin.com/hapofu/edit?js,console

これはコンソールに出力されます:

Observable.defer
maleList [ { id: 1, name: 'Todd', gender: 'M' } ]
femaleList [ { id: 2, name: 'Lillian', gender: 'F' } ]

これらのサブスクライバーは両方とも同じ接続を共有し、同時にsource応答が「再生」されます (最初に発行された後にサブスクライブすると、再度サブスクライブせずに再送信されますsource)。

からのアイテムfilter()は一度に 1 つずつ放出されることに注意してください。そのためtoArray()、以前はすべての値を収集し、それらを 1 つの配列として再送信していました。または、たとえば呼び出すこともできます。maleList.push()すべての値で。

ところで、2 つのサブスクリプションの作成を避けるpartition()代わりに使用できる演算子もあります。filter()

于 2016-12-13T13:13:45.460 に答える