asObservable()使用

在angualr文档 ——> 组件交互——> 父组件和子组件通过服务来通讯中遇到一段代码

private missionAnnounceSource = new Subject<string>();
private missionConfirmedSource = new Subject<string>();

missionAnnounced$ = this.missionAnnounceSource.asObservable();
missionConfirmed$ = this.missionConfirmedSource.asObservable();

这里使用了Rxjs中的Subject, 查了一下文档发现Subject是一个特殊的Observable,它允许将值多播给多个观察者
而且 每个 Subject 都是 Observable 每个 Subject 都是观察者 也就是说Subject可以被订阅,同时也具有观察者的三种方法:next,error,component
所以我们将代码改一下:

/* mission.service.ts */
missionAnnounced$ = this.missionAnnounceSource;
missionConfirmed$ = this.missionConfirmedSource;
/* missioncontrol.compolent.ts */
announce() {
  let mission = this.missions[this.nextMission++];

  this.missionService.missionConfirmed$.next('hello'); // 新增代码

  this.missionService.announceMission(mission);
  this.history.push(`Mission "${mission}" announced`);
  if (this.nextMission >= this.missions.length) { this.nextMission = 0; }
}

我们可以在页面看到这样的效果
image.png
说明在这里我们已经将service拿到的值做了更改,然而我们再这里使用Subject的目的是让其作为Observables使用,
因此我们使用asObservable() 做一点处理

/* mission.service.ts */
missionAnnounced$ = this.missionAnnounceSource.asObservable();
missionConfirmed$ = this.missionConfirmedSource.asObservable();

我们再看一下效果
image.png
这里出现了一个错误,说next()不存在,这说明了Subject不在作为观察者使用了
再将代码做一点更改

/* missioncontrol.compolent.ts */
announce() {
  let mission = this.missions[this.nextMission++];

  //this.missionService.missionConfirmed$.next('hello'); // 删除这行代码,程序将正常运行

  this.missionService.announceMission(mission);
  this.history.push(`Mission "${mission}" announced`);
  if (this.nextMission >= this.missions.length) { this.nextMission = 0; }
}
### 使用 Reactive 编程实例教程 #### 创建 Observable 序列 为了创建一个 `Observable` 对象,可以使用多种方式。最常见的是通过静态工厂方法来构建特定类型的序列。 ```java // 创建简单的整数序列 Observable<Integer> simpleSequence = Observable.just(1, 2, 3); ``` 此代码片段展示了如何利用 `just()` 方法快速生成包含固定数量项的序列[^2]。 #### 处理 UI 输入事件 对于图形界面应用程序中的交互行为处理,通常会涉及到监听器模式的应用。然而,在响应式编程环境中,则可以通过将这些输入源转换成可观察对象来进行更优雅的操作: ```csharp var buttonClicksAsObservables = from ev in Button.ClickEvent.AsObservable() select (ev.Source as Button).Content.ToString(); ``` 上述 C# LINQ 表达式说明了怎样把 WPF 控件上的点击动作转化为字符串形式的消息流[^1]。 #### 合并多个数据源 有时需要同时关注来自不同地方的数据更新情况。这时就可以借助于诸如 `merge` 这样的组合算子实现多路复用的效果: ```javascript const mouseMoves$ = fromEvent(document.body, 'mousemove'); const keyPresses$ = fromEvent(document, 'keydown'); merge(mouseMoves$, keyPresses$).subscribe(event => console.log(`Event type: ${event.type}`)); ``` 这里 JavaScript 的例子显示了如何捕获页面内的鼠标移动以及键盘按键两种独立活动,并统一输出日志信息。 #### 数据变换与累积计算 除了基本的选择和过滤外,还可以应用更加复杂的映射逻辑或是执行累计运算。比如下面这段 Swift 代码就实现了对一系列数值求和的过程: ```swift let numbers = PublishSubject<Int>() numbers.scan(into: 0) { sum, number in $0 += number }.bind(to: label.rx.text) { "\($0)" } .disposed(by: disposeBag) numbers.onNext(5) numbers.onNext(7) // Label will show "12" ``` 该案例中不仅体现了 `scan` 函数的作用——即基于前一次的结果加上当前元素得到新的状态值;同时也展现了如何无缝对接 UIKit 组件完成视图层刷新的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值