Sla*_*sov 4 asynchronous undefined subscription angular
简而言之..我无法访问我的新闻对象。在函数中调用时,它以“未定义”形式返回。
在我的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);
}
Run Code Online (Sandbox Code Playgroud)
如果要以顺序方式返回可观察值,则不应嵌套subscribe()方法。相反,我们应该使用RxJS的mergeMap来将ActivatedRoute的可观察值映射到内部的可观察值中,该内部可观察值已分配给该newsID属性。然后,我们getSectors()从中调用方法_newswireService,然后subscribe()在下一行返回observable 。这样,您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();
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |