【问题标题】:Angular - two subscriptions in ngOnInit result in object 'undefined'Angular - ngOnInit 中的两个订阅导致对象“未定义”
【发布时间】:2019-09-02 10:09:18
【问题描述】:

简而言之.. 我无法访问我的新闻对象。在函数中调用时,它会以“未定义”的形式返回。

在我的 ngOnInit 中,我有两个订阅。 第一个返回一个新闻对象(在组件顶部定义为一个全局变量)。

第二次订阅返回一个路由参数,然后触发一个函数(navigateToArticle)。

现在...当第二个订阅触发“navigateToArticle”函数时,我希望该函数能够访问新闻对象。

但是,每次我尝试通过控制台记录新闻对象时,它都会返回为“未定义”。 现在我明白这与订阅是异步的有关。

所以我的问题是,我怎样才能确保新闻对象已被加载并可供“navigateToArticle”函数访问。 可能是某种检查以查看是否已加载新闻?

抱歉,我是 Angular 新手,所以请放轻松。我确定我错过了一些非常简单的东西。 为了清楚起见,我已将代码精简到最低限度。

public news: Newswire;

ngOnInit() {

    this._newswireService.getSectors().subscribe((news: Newswire) => {
      this.news = news;
    }

    this._activatedRoute.paramMap.subscribe(params => {
       this.newsID = params.get('id');
       this.navigateToArticle();
    })

}

public navigateToArticle() {
    console.log(this.news);
}

【问题讨论】:

    标签: angular asynchronous undefined subscription


    【解决方案1】:

    如果您想按顺序返回可观察对象,则不应嵌套 subscribe() 方法。相反,我们应该使用 RxJS 的 mergeMap 将可观察值从激活路由映射到内部可观察值,该可观察值分配给 newsID 属性。然后,我们从_newswireService 中调用getSectors() 方法,然后在下一行的subscribe() 中返回observables。这样一来,您的news 就不会是未定义的。

    不要忘记将 mergeMap 导入到您的组件中!

    import { mergeMap } from 'rxjs/operators';
    
    //.
    //.
    
    this._activatedRoute.paramMap.pipe(
      mergeMap(params => {
        this.newsID = params.get('id');
        return this._newswireService.getSectors();
      })
    ).subscribe(res => {
      this.news = news;
      this.navigateToArticle();
    })
    

    【讨论】:

    猜你喜欢
    • 2018-06-12
    • 2019-01-25
    • 2019-04-16
    • 2020-02-12
    • 2017-06-19
    • 2019-11-14
    • 1970-01-01
    • 2020-11-21
    • 2017-06-09
    相关资源
    最近更新 更多