订阅了观察到的内容后点击

时间:2019-10-28 12:24:01

标签: rxjs rxjs6

是否可以向已订阅的可观察对象添加更多操作?我尝试了下面的代码,该代码不起作用,因为未执行订阅后再点击一次部分(代码为here

import { of, timer } from 'rxjs';
import { tap, map, take } from 'rxjs/operators';

const source = timer(1000, 1000);
//transparently log values from source with 'do'
const example = source.pipe(
  take(3),
  tap(val => console.log(`BEFORE MAP: ${val}`)),
  map(val => val + 10),
  tap(val => console.log(`AFTER MAP: ${val}`))
);

//'do' does not transform values
//output: 11...12...13...14...15
const subscribe = example.subscribe(val => console.log(val));

example.pipe(
  tap(val => console.log(`One more tap after subscribe: ${val}`))
);

例如,我想到的使用cas就是进行http呼叫的地方,并且需要根据呼叫的响应来更新多个服务。

2 个答案:

答案 0 :(得分:0)

我不确定您要实现什么目标,但是pipe()函数不会更改源Observable。它只是输出一个新的Observable,它是由旧的pipe()和您在5; 中添加的运算符产生的。因此,您的最后一行代码就像编写

example = example.pipe(
  tap(val => console.log(`One more tap after subscribe: ${val}`))
);

意味着您将值设置为语句。也许您可以在转换后将您的Observable分配给它自己(尽管我敢肯定,它看起来很难看,对其他人来说很难理解,因此应该避免)。

        <Picker
  selectedValue={this.state.role}
  style={{height: 50, width: 300}}
  onValueChange={(itemValue, itemIndex) =>
    this.setState({role: itemValue})
  }>
  <Picker.Item label="Admin" value="ad" />
  <Picker.Item label="Coordinator" value="cod" />
</Picker>

也许您应该更详细地说明您的特定用例,以便我们找到更清洁的解决方案。

答案 1 :(得分:0)

这将是您最终想要实现的目标

  

例如,我想到的使用cas就是进行http呼叫的地方,并且需要根据呼叫的响应来更新多个服务。

const onExampleCalled=new Subject();
// listen to example called
onExampleCalled.subscribe(console.log)
example.pipe(tap(result=>onExampleCalled.next(result)).subscribe()