我必须在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
答案 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
答案 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,您可能会发现它有用: