Angular 如何在不中断可观察流订阅的情况下向受试者发送不同的可观察结果?

Angular 如何在不中断可观察流订阅的情况下向受试者发送不同的可观察结果?,angular,rxjs,observable,reactive,subject,Angular,Rxjs,Observable,Reactive,Subject,用一个简明的例子编辑了这个问题。我想这会让人们更容易理解。请注意,这个例子是超级简化的,通常我在不同的组件之间分层,但对于这个问题,它就足够了 以这个组件为例。它获取获取的对象的名称,以及获取下一个对象的按钮。为了获得下一个REST请求的值,我知道除了订阅答案之外没有其他方法,我想要的是像“combineLatest”这样的东西,但是为了“未来”,所以我可以在以后的流中使用combineLatest 从'@angular/core'导入{Component,VERSION,OnInit}; 从“

用一个简明的例子编辑了这个问题。我想这会让人们更容易理解。请注意,这个例子是超级简化的,通常我在不同的组件之间分层,但对于这个问题,它就足够了

以这个组件为例。它获取获取的对象的名称,以及获取下一个对象的按钮。为了获得下一个REST请求的值,我知道除了订阅答案之外没有其他方法,我想要的是像“combineLatest”这样的东西,但是为了“未来”,所以我可以在以后的流中使用combineLatest

从'@angular/core'导入{Component,VERSION,OnInit};
从“rxjs”导入{BehaviorSubject,Observable};
从'@angular/common/http'导入{HttpClient};
@组成部分({
选择器:“我的应用程序”,
templateUrl:“./app.component.html”,
样式URL:['./app.component.css']
})
导出类AppComponent实现OnInit{
私有只读人员\u API\u终结点=`https://swapi.dev/api/people/`;
私人角色主体:行为主体

有什么方法可以做到这一点吗?像“emitIn(characterSubject)”。我认为没有什么像这样的方法,比如动态地将源排放添加到源中

检索到的原始组件observable是动态更改的,但这将是非常危险的(任何管道都可能破坏任何observable)。我需要另一个不是管道的东西

我不同意。您可以使用基于输入数据返回可观测值的函数轻松创建动态可观测值,并且不会中断

function getUserFriendsById(userId: string): Observable<User[]>{
return service.getProfileById(userId).pipe(
  mergeMap(user=>{
    return getUsersByArrayOfIds(user.friends);
  })
 )
}

getUserFriendsById('exampleUserId').subscribe(friends=>{...});
甚至当您需要通过
dataRepository.fetch(id)
response调用另一个Observable时

dataRepository.fetch(id).pipe(
mergeMap(fetchedId=>{
    return getUserById(fetchedId);
  })
)
但是,如果你想更深入地创建一个流而不传递数据,我想你会失望的,因为这是一般情况下可观察的工作方式。我猜这种方法非常有限,很难维护,因为你最终到达了一个点,你需要向多个API发送不同的请求并收集数据,这就是流我会崩溃的。


我希望它能有所帮助,但如果它不是您想要的,请告诉我。

如果我理解正确,您有一个服务,它具有一些触发http调用的方法,如
dataRepository.fetch(id)
,并且您有不同的组件需要在调用响应到达时做出反应

如果是这样的话,有很多方法可以处理这样的需求,其中一种是使用作为服务的公共属性公开的主题,我知道您希望这样做

为了实现这种行为,您所编写的代码就是您所需要的,换句话说,这是可以的

dataRepository.fetch(id)
  .subscribe(
    newData => currentData.next(newData)
  )
如果您想使其更加完整,并管理
错误
完整
案例,您可以这样编写

dataRepository.fetch(id)
  .subscribe(currentData)
在最后一种形式中,您将
currentData
作为
subscribe
currentData
的观察者参数传递,尽管它也是可观察的,因此可以
next
error
complete


如果您使用
ReplaySubject
,您可以添加存储最后结果的可能性,并将其呈现给在结果通知后创建的组件。

hm我想我没有得到它-如果您想延迟实际订阅时间,视图应该从
currentData
数据存储库获取数据吗你可以使用
publish
connect
。这是你想要的吗?如果你经常遇到这个问题,并且不想使用NgRx这样的状态管理库,你可能想用纯RxJS来研究状态管理。-我想我会用一个具体的例子来编辑这个问题。也许你会更容易理解它理解。我想我用“动态”的东西错误地解释了我自己。当我指的是“动态”的时候,我指的是类似于原始行为的东西:源将发射:1(t0),2(t2),3(t3),C从源管道第一次观测到,与第一次相比,该观测值将是1(t0),C从源管道第二次观测到,映射x=>x*2。该观测值将带来2(t0),4(t2),6(t3),C注意第一个和第二个管道源(两个ner观测值)如何在它们之间不相互作用。但是如果它们是动态的,我的意思是每个管道会改变其他的可观测值,基本上是改变源。这根本不是反应式的工作原理,我知道,我的意思是这也会很危险,因为它会将一个可观测值耦合到它的每个实例。源将发出:1(t0),2(t2),3(t3),C从源管道第一个可观测值与第一个。该可观测值将是1(t0),C,但是源也将是1(t0),C秒,可以从源管道中观察到,Map x=>x*2。这个可观察到的,先前的,源现在将变成2(t0),CSo除了必须与可观察到的同步之外,没有其他方法了?(使用subscribe).羞耻D:。虽然我知道如果你订阅了一个可观察对象,你就获得了可观察对象的所有优势,因此它将自己处理3个操作。但是订阅不会打破反应链吗?比如| HTTP获取->反应/异步|订阅->命令/同步|服从异步管道->ReacApple/Active(异步)在中间中断是我想要避免的。但是从你说的看来,它周围没有选择。BTW我不知道你的最后一个例子。因为事情是每当事件触发时,我创建一个新的提取,但是组件不知道有一个新的源,我不得不手动更新每一个。它们,这有点违背了observables@JoshiRaez的目的。你有一个事件要多路传输到n个通知。所以我认为你没有其他方法使用RxJS。另外,我不认为被动是异步的,而命令是同步的。RxJS可以完全被动和完全同步
// RxJS v6+
import { Observable } from 'rxjs';
/*
  Create an observable that emits 'Hello' and 'World' on  
  subscription.
*/
const hello = Observable.create(function(observer) {
  observer.next('Hello');
  observer.next('World');
  observer.complete();
});
dataRepository.fetch(id)
  .subscribe(
    newData => currentData.next(newData)
  )
dataRepository.fetch(id)
  .subscribe(currentData)