如何在RXJS Observable中转换属性

时间:2019-06-26 13:21:46

标签: javascript angular rxjs observable

我必须在RXJS Observable中转换对象属性。 使用“地图”运算符可以工作。 当我两次订阅相同的可观察对象时,就会发生问题:属性被两次转换

我尝试使用“ share”运算符和多种变体,但似乎无济于事

代码示例:

    const source = of(
      { id: 1, name: 'John' },
    );

    const personObservable = source.pipe(
      map(person => { 
        person.name = person.name + '_test'; return person; 
      }),
    );

    personObservable.subscribe(
      person => console.log('first: ', person)
    );

    personObservable.subscribe(
      person => console.log('second: ', person)
    );

预期结果:

first:  John_test
second:  John_test

实际结果:

first:  John_test
second:  John_test_test

2 个答案:

答案 0 :(得分:5)

这是因为您要两次修改同一对象实例。当地图返回该对象的副本时,将不会发生。试试这个:

In [232]: res = df.assign(falls_into_CI=angle_falls_into_interval(df.circ_time_angle, 
                                                                  df.ci_low, 
                                                                  df.ci_high,
                                                                  high=360))

In [233]: res
Out[233]:
    ci_low  circ_time_angle  ci_high  falls_into_CI
0       30               30       30           True
1       10                0       20          False
2     -188              143      207           True
3     -188                4      207           True
4     -188                8      207           True
5     -188               14      207           True
6     -188              327      207           True
7      242               57      474           True
8      242              283      474           True
9      242                4      474           True
10    -190              200       -1           True
11     -90              300        0           True
12     -25               15       60           True
13     -30              349      350           True
14     420               30      600          False
15    -100               23      719           True
16    -100               23      259           True
17    -350                5      -10          False
18    -350               11      -10           True

您还可以将const personObservable = source.pipe( map(person => ({ ...person, name: person.name + '_test' })), ); 运算符与原始映射功能一起使用:

shareReplay

Stackblitz

答案 1 :(得分:0)

另一种解决方案是使用$pubsubService = new Google_Service_Pubsub($client); $req = new Google_Service_Pubsub_PublishRequest(); $req->setTopic("testtopic"); $msg = new Google_Service_Pubsub_PubsubMessage(); $msg->setData("...."); $req->setMessage($msg); $opts = array( "myattr" => "test" ); $ret = $pubsubService->topics->publish($req, $opts); Observable.create创建您的Observable。

new Observable()创建一个多播Observable。 of将创建一个冷的单播Observable,它为每个Observer发出一个新的对象实例。

new Observable

正在工作的StackBlitz:

https://stackblitz.com/edit/angular-bdhjuo

我最近还写了一篇文章,解释了热和冷的Observable,您可能会发现它有用:

http://willtaylor.blog/rxjs-observables-hot-cold-explained/