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

RxJS主题/可观察问题

洪光霁
2023-03-14

我试图将一个角度函数转换为可观察模式,因为它的当前实现与它有一些异步性。为了讨论这个问题,我们举一个简单的例子。

aFunction(x: boolean){
    if(x){
        // ... do something asynchronous based on the value of x
    }
}

可以通过以下方式将其转换为使用可观察对象:

anObservableFunction(x: boolean): Observable<any> {
    const result = new Subject();
    if(x){
        // ... do something asynchronous based on the value of x
        // ... where once the actual value you want to return to 
        // the subscribing functions, you can pass in the 
        // result.next(value);
        // result.complete();
    }
    return result.asObservable();
}

我所面临的问题(据我所知)是针对无法访问内部选择语句的情况。

anObservableFunction(x: boolean): Observable<any> {
    const result = new Subject();
    if(x){
        // ... do something asynchronous based on the value of x
        // ... where once the actual value you want to return to 
        // the subscribing functions, you can pass in the 
        // result.next(value);
        // result.complete();
    } else {
        // here
    }
    return result.asObservable();
}

如果使用常规主题,订阅函数肯定不会得到任何值,因为事件的顺序是:

  • 函数被调用
  • 主题已创建
  • 值已设置
  • 调用函数订阅,因此仅在此事件发生后获取值

如果使用了BehaviorSubject或ReplaySubject,它们的初始/构造值将被保留,从而导致不必要地触发订阅事件?

共有1个答案

臧兴学
2023-03-14

如果值是同步发出的,则使用主题会有问题,这是正确的。BehaviorSubject的缺点是有一个不必要的初始值,但是ReplaySubject实际上没有这个值,并且可以工作,但是如果以后有人订阅了您可能不想要的方式,它也会重播这个值。

一个简单的技巧是将同步发射延迟一个滴答声:

setTimeout(() => result$.next(42), 0);

但是,您也可以直接返回可观察对象,并避免使用主题:

foo(x) {
  if(x) {
    return callRemoteEndpoint();
  }

  return of(42);
} 
 类似资料:
  • 在android 6.0.1 Samsung s6 Edge+上的测试 当device screen脱机并从debug中拔出时,可观察到的只是停止发射项目。如果设备打开,则开始发射对象。另一个问题是,在停止接收项目之前,我会按照相同项目的顺序随机地得到2/3个重复调用 ____________________________edit_________________________________

  • 我对Observables和RxJs是新手,我想对回报进行调整。如果第一个选择器返回某个值,我希望第二个选择器可以观察到。但是如果第一个选择器没有返回那个特定的值,我想返回false,而不是(false)。我已经走了这么远,但这返回了一个可观察的结果

  • 有人能向我解释一下为什么运算符可以接受返回或的函数吗? 官方文件说: FlatMap运算符通过将您指定的函数应用于源可观察对象发出的每个项目来转换可观察对象,其中该函数返回本身发出项目的可观察对象。 为什么它也可以返回数组? 例如,它们都是有效的: 但这不起作用:

  • 因此,我有一个NgRx选择器,它返回一个带有一系列触点的可观测值。我想映射这个流,对于每个联系人数组,映射每个联系人,并向Github发出Http请求以获取他们的配置文件图像,并将其附加到联系人对象。然而,我不知道如何做到这一点,而不以一系列的可观测数据结束。 下面是我尝试过的,但这不起作用。 下面是我收到的错误消息: 如有任何建议,将不胜感激!

  • 我正在学习RxJS,对于“听众”在哪里(在可观察的或观察者中),他们是如何订阅/取消订阅的,以及当观察者“不再对”可观察的“不感兴趣”时会发生什么,比如当你使用或。 对于第一部分——什么是订阅什么,什么是倾听者——我对这些陈述之间看似矛盾的地方感到困惑。从http://reactivex.io/rxjs/manual/overview.html我们读到观察者不是观察者的“听众” 这与addEven

  • 我正在努力理解rxJs观察者/可观察的。 我有一个Angular应用程序,其中一个服务创建一个可观察的: 闲聊服务ts: 当聊天室中收到消息时。服务ts,消息(假定)是多播的: 两个组件以这种方式订阅可观察对象: 问题:只有一个(最后一个订阅的)收到消息。 问:我如何配置可观察到多播到所有订阅者?