当前位置: 首页 > 知识库问答 >
问题:

在RxJS中组合不同种类的可观测项,但只发射来自其中一个的值

巴照
2023-03-14

我有一个行为主题和两个事件发射器。每当BehaviorSubject发出新值或任一EventEmitter发出事件时,我需要创建一个Observable,它返回BehaviorSubject的最新值。基本上,我并不关心EventEmitter发出的事件的值,它们应该只是一个触发器,以推出BehaviorSubject的最新值。

下面是一个例子:

import Rx from 'rxjs';
import {map} from 'rxjs/operators'
import {EventEmitter} from '@angular/core'

const bSubject = new Rx.BehaviorSubject('value1');
const emitter1 = new EventEmitter();
const emitter2 = new EventEmitter();

// Should I be using something othere than merge to create the Observable?
// Is merge ok but I should be using a special operator?
const myOberservable = Rx.merge(bSubject, emitter1, emitter2)

myOberservable.subscribe({next: value => console.log(value)});

emitter1.emit('event1');
bSubject.next('value2');
emitter2.emit('event2');
bSubject.next('value3');

/**
 * It prints:
 *  value1
 *  event1
 *  value2
 *  event2
 *  value3
 * 
 * But I want it to print:
 *  value1
 *  value1
 *  value2
 *  value2
 *  value3
 */

共有1个答案

孔硕
2023-03-14

组合mergeWithLatestFromMap。顺便说一句,我已经更新了代码片段,以启用树摇动。

import { merge, BehaviorSubject } from 'rxjs';
import { withLatestFrom, map } from 'rxjs/operators'
import {EventEmitter} from '@angular/core'

const bSubject = new BehaviorSubject('value1');
const emitter1 = new EventEmitter();
const emitter2 = new EventEmitter();

const merged = merge(bSubject, emitter1, emitter2);
const myOberservable = merged.pipe(withLatestFrom(bSubject), map(x => x[1]));

myOberservable.subscribe({ next: value => console.log(value) });

emitter1.emit('event1');
bSubject.next('value2');
emitter2.emit('event2');
bSubject.next('value3');
 类似资料:
  • 我有一个简单的api请求,它向一个对象返回一个可观察的对象,该对象中有一组项,每个项中都有一个链接。因此,我想在当前异步流中直接获取链接后面的数据,但我收到一个CORS错误,错误是: 这是否可能与我当前的函数?还是我误解了一些基本概念?

  • 我想计算单个可观测物体的排放量之间的差异。 如果一个可观测的物体发出一个新的值,有没有办法同时得到它当前和以前的发射?我想要这样的东西: 我该怎么做呢?我是否需要将每个发射存储在一个上限变量中,或者是否有一种奇特的RxJS方法来实现这一点?

  • 好的,这是一个快速的,我已经有点累了,我在困惑自己: D 我正在使用angular2和RxJS观测设备。 我有一个带有属性“数据”的服务,这是一个在构造函数中设置的可观察对象,以及一个返回此可观察对象以订阅的方法。 前一段时间,我曾与replaySubject合作,总是向新订阅者发出序列的所有值。然而,通过上面的代码,可观测的似乎向新用户发出了它的最新值。这是有意的吗? 每次迭代我都会得到一个值。

  • 我正在使用angularfire,我得到了一个连续的阵列流,其中包含任务ID。我需要获取数组中每个id的任务文档作为一个新的可观察的。然后将任务文档数组返回到流中,这样我就可以在组件中订阅它并显示任务列表。 到目前为止,我用mergeMap得到了它。我分割阵列,获取任务文档并将它们返回到流中。我的解决方案唯一的问题是,当我订阅可观察到的时,我没有得到一系列任务,但每个任务都是一个单一的变化,我不能

  • 我有一个沙盒,它订阅了一个消息流,我想过滤该流,以查找已发送到或从特定用户使用另一个组件中指定的路由参数接收的消息。 messages.sandbox.ts: messages.detail.container.ts this.matching消息$似乎只包括this.received消息$但是我知道this.sent消息$不是空,因为我可以在我的模板中使用它没有问题。 我是不是遗漏了一些合并观测

  • 我有两个源观测值,当一个源观测值发出时,我需要计算一些数据。我试图使用操作符,但它只在每个源观测值第一次发出时发出一个值。 是否有任何运算符类似于,一旦任何源可观测对象第一次发出,就立即发出?如果没有,最清晰的方法是什么? 我所尝试的: