Angular 2订阅订阅另一个异步功能的服务

Posted

技术标签:

【中文标题】Angular 2订阅订阅另一个异步功能的服务【英文标题】:Angular 2 subscribing to a service which is subscribed to another async function 【发布时间】:2018-01-13 06:45:50 【问题描述】:

我正在尝试开发一个 Angular 应用程序,在这种情况下,我正在调用订阅 HTTP 服务的服务。我编写了一个警报提示服务,它在按下“ok”时在内部调用 HTTP 服务。像这样:

this.alertservice.prompt(url);

这将提示用户确认。如果用户点击“ok”,alert服务会在内部调用HTTP服务:

this.httpservice.get(url).subscribe(res => 
  console.log(res);
);

现在我想通知父调用者调用是失败还是成功。比如:

 this.alertservice.prompt(url).subscribe(res => 
   console.log("success or failure");
 );

但我不明白如何订阅警报功能。我该怎么做?

【问题讨论】:

【参考方案1】:

在子服务中使用do,在父服务中使用catch

child() 
  return this.httpservice.get(url).do(res=>
    console.log(res)
  ).catch(e => 
    console.log("handle error");
  );


parent() 
  this.child(url).subscribe(res=>
    console.log("success");
  , e => 
    console.log("or failure");
  );

【讨论】:

实际上无法处理父组件中的错误,因为它的sweetalert回调并且大部分代码已经基于此服务编写。我必须在警报组件中进行错误处理并发送字符串或布尔值对父母的价值。有可能吗?【参考方案2】:

可能是这样的:

import ..., EventEmitter from '@angular/core';

export class AlertService 

     ...

     prompt(url:string): Observable<boolean> 

         let result = new EventEmitter<boolean();

         this.httpService.get(url).subscribe
             (
             (res) => 
               console.log("OK:", res);
               result.emit(true);
               result.complete();
             ,
             (error) => 
               console.log("ERROR:", error);
               result.emit(false);
               result.complete();
             
         );
         return result;
     

现在您可以订阅 prompt() 函数:

this.alertService.promp(url).subscribe((okOrNotOk) => 
     // okOrNotOk will be true, when the url was retrieved successfully, 
     // otherwise false
);

我不是 rxjs 方面的专家,也许有更好的方法来做到这一点。

【讨论】:

如果您找到更好的答案,请更新答案,以便任何搜索此内容的人受益 这不是 rxjs 方式。您应该使用内置错误通知方法(例如订阅中的第二个回调)而不是 bool 回调参数。

以上是关于Angular 2订阅订阅另一个异步功能的服务的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2:许多异步管道与一个订阅

NgrxStore 和 Angular - 大量使用异步管道或在构造函数中只订阅一次

尝试在我当前的 Angular 应用程序中使用异步管道而不是订阅

Angular 2 从 RxJs 订阅返回数据

Angular 5:无法使用异步管道更新模板

如何删除/更新异步方式以及何时取消订阅?