Angular 当它不';有些失败了也没关系吗?

Angular 当它不';有些失败了也没关系吗?,angular,typescript,observable,Angular,Typescript,Observable,当一个页面开始时,我必须订阅多个观察值,并且在开始之前我必须等待所有的响应。我看到的第一件事是forkjoin,但当一个内部观察对象抛出错误时,它失败了,而我丢失了其他观察对象的值 我做了一些像这样的东西,它很有效。。。但我相信有更好的方法: getResult(){ 让重要的服务负责1 让重要的服务负责2 让观察者响应3 让观察者做出反应 返回新的可观测值(obs=>{ this.firstObservable().subscribe( 响应=>{ ImportantToServableRes

当一个页面开始时,我必须订阅多个观察值,并且在开始之前我必须等待所有的响应。我看到的第一件事是forkjoin,但当一个内部观察对象抛出错误时,它失败了,而我丢失了其他观察对象的值

我做了一些像这样的东西,它很有效。。。但我相信有更好的方法:

getResult(){
让重要的服务负责1
让重要的服务负责2
让观察者响应3
让观察者做出反应
返回新的可观测值(obs=>{
this.firstObservable().subscribe(
响应=>{
ImportantToServableResponse1=响应
if(重要的可观察响应2、可观察响应3、可观察响应4)
obs.next([ImportantTobservableResponse1,ImportantTobservableResponse2,observableResponse3,observableResponse4])
},错误=>{
let error=this.makeError(error)
obs.error(错误)
}
)
this.secondObservable().subscribe(
响应=>{
ImportantToServableResponse2=响应
if(重要的可观察响应1、可观察响应3、可观察响应4)
obs.next([ImportantTobservableResponse1,ImportantTobservableResponse2,observableResponse3,observableResponse4])
},错误=>{
let error=this.makeError(error)
obs.error(错误)
}
)
third.thirdObservable().subscribe(
响应=>{
ObservereResponse3=响应
if(重要服务响应1、重要服务响应2、可观察响应4)
obs.next([ImportantTobservableResponse1,ImportantTobservableResponse2,observableResponse3,observableResponse4])
},错误=>{
observableResponse3=错误
if(重要服务响应1、重要服务响应2、可观察响应4)
obs.next(错误)
}
)
此.fourthObservable().subscribe(
响应=>{
ObservereResponse4=响应
if(重要服务响应1、重要服务响应2、可观察响应3)
obs.next([ImportantTobservableResponse1,ImportantTobservableResponse2,observableResponse3,observableResponse4])
},错误=>{
observableResponse4=错误
if(重要服务响应1、重要服务响应2、可观察响应3)
obs.next(错误)
}
)
})
}
我已经把我所有的订阅放在一个可观察的位置,当我有了所有的信息


即使有些响应失败,是否至少有一种方法可以一次获得所有响应?

响应的顺序是否重要?响应可以是空的还是未定义的

如果您只想输出一组响应,让所有订阅都由同一件事处理,我会亲自重新配置
getResult()
机制。主要是因为我不喜欢这样的分层观察,感觉太凌乱,难以阅读

我所说的重新配置的意思是:将一个可观察的结果初始化并坐在事物可以订阅的地方,而不是将可观察的结果作为
getResult()
方法本身的一部分返回。这允许任何数量的东西订阅它,您可以任意获取/刷新数据,并在发生时将所述数据推送到所有这些订阅者

private resultObs: Observer<any[]>;
private resultResponses: any[];

private _result$: Observable<any[]>;

constructor() {
  this._result$ = new Observable<any[]>((x: Observer<any[]>) => { this.resultObs = x; }).pipe(share());
}

public get result$(): Observable<any[]> { return this._result$; }

// Method no longer returns anything, it's merely a triggering method
public getResult(): void {
  this.resultResponses= [];

  this.firstObservable().subscribe(x => this.handleResponse(1, x), err => this.handleError(1, err));

  this.secondObservable().subscribe(x => this.handleResponse(2, x), err => this.handleError(2, err));

  // ...
}


private handleResponse(order: number, response: any): void {
  // If order matters, handle relevant inserting here
  this.resultResponses.push(response);


  // Assuming you only want to emit when all 4 have come in successfully
  if (this.resultResponses.length === 4 && this.resultObs) {
    // Note: the this.resultObs check will ensure you don't get any errors
    // when trying to emit if nothing has subscribed to it yet...
    this.resultObs.next(this.resultResponses);
  }
}

private handleError(order: number, error: any): void {
  // Do whatever you need to do on failures
  console.error(error);
}


编辑:修复了值emit的愚蠢错误。

非常感谢!这是我一直在寻找的东西!!!我正在尝试实现它,但HandlerResponse上的行“this.result$.next(this.resultResponses);”有问题。它说“属性'next'不存在于'Observable'类型上。”“啊,我的错误-不是Observable(
result$
)发出(
next()
),而是Observator(
ResultTobs
)。更换它,它应该可以正常工作。
public ngOnInit(): void {
  // Subscribe to the result observable
  this.service.result$.subscribe((x: any[]) => this.onResultResponse(x));

  // Trigger the retrieval of the data
  this.service.getResult();
}

private onResultResponse(data: any[]): void {
  // Handle your data now you've got it
  console.log('Got results:', data);
}