如何在 ngOnInit 上订阅两次?

Posted

技术标签:

【中文标题】如何在 ngOnInit 上订阅两次?【英文标题】:How can you subscribe twice on ngOnInit? 【发布时间】:2019-10-25 20:06:13 【问题描述】:

我必须在 component.ts 中的 ngOnInit() 上订阅两次,但您似乎只能订阅一次。第二次订阅被忽略。

我该如何解决?

我对其进行了测试并更改了功能,并且总是第一个订阅有效,第二个订阅被忽略..

这只是一个伪代码,所以不要因为奇怪的命名而怀疑。

//service.service.ts
getUser(id: string)
   return this.http.get(this.url)


getOrder()
   return this.http.get(this.anotherUrl)


//component.ts

constructor(private service: Service)

public user: object;
public order: object;
public userID: string;
ngOnInit()
    this.userID = this.route.snapshot.params['id'];
    this.service.getUser(this.userID).subscribe(user =>  this.user = user );

    this.service.getOrder().subscribe(order =>  this.order = order );

这行不通。只有第一个订阅有效,第二个将被忽略。

我能做些什么呢?怎么会是对的?

谢谢

【问题讨论】:

您可以订阅任意数量的内容。您是如何得出第二次订阅被忽略的结论的?那些是不相关的订阅,应该没有问题 如果我尝试控制台日志它什么都不会出现.. 嗯,你看到网络标签中的http调用了吗? 是的,第二次退出状态为 500(内部服务器错误),但调用本身是正确的并导致数据 那么这似乎是您的 API 中的一个问题 :) 【参考方案1】:

您的要求并不清楚,您的示例代码并没有真正的帮助。

订阅接受错误处理回调作为第二个参数。 由于这似乎是 API 问题,您可以像这样捕获错误:

getData() 
    this.http.get(this.url).subscribe((result) => 
      this.data = result;
      console.log(this.data);
    ,
    (errror: HttpErrorResponse) = > 
        // Error handling here
        console.log(errror);
    );
    

除此之外,还可以在 ngOnInit 中订阅多个 observable。

【讨论】:

以上是关于如何在 ngOnInit 上订阅两次?的主要内容,如果未能解决你的问题,请参考以下文章

如何在订阅和 ngOnInit 方法中循环遍历数组?

如何运行构造函数或 ngOnInit 两次或更多次

Angular ngOnInit 如何将订阅结果用于另一个订阅/后端调用?

删除在 ngOnInit() 上订阅服务创建的空行

Angular 2 App Component ngOnInit 在使用 iframe 时调用了两次

组件 ngOnInit 中的 Angular 订阅