【发布时间】:2019-09-29 05:13:51
【问题描述】:
我目前正在评估替换 Angular 的优缺点。 RxJS 的 Observable 和普通的 Promise,这样我就可以使用 async 和 await 并获得更直观的代码风格。
我们的一个典型场景:在ngOnInit 中加载一些数据。使用Observables,我们这样做:
ngOnInit () {
this.service.getData().subscribe(data => {
this.data = this.modifyMyData(data);
});
}
当我从getData() 返回Promise 并使用async 和await 时,它变为:
async ngOnInit () {
const data = await this.service.getData();
this.data = this.modifyMyData(data);
}
现在,很明显,Angular 不会“知道”ngOnInit 已经变成了async。我觉得这不是问题:我的应用程序仍然像以前一样工作。但是当我查看OnInit 接口时,该函数显然没有以表明它可以声明为async 的方式声明:
ngOnInit(): void;
所以——底线:我在这里做的事情合理吗?或者我会遇到任何不可预见的问题?
【问题讨论】:
-
根据issue 17420中的this comment:“有人使用
async ngOnInit不是问题,这只是一种尴尬/不推荐的编码习惯。” -
@ConnorsFan 在打开我的帖子之前,我实际上已经完全阅读了这个问题 :-)(应该链接它)。我仍然不确定,“尴尬”和“不推荐”是否有任何客观原因,还是 Angular 团队只是想推向响应式风格?
-
Here 是关于这个主题的另一本好书。
-
@qqilihq - 嗨,我正在考虑进行此转换。您是否继续进行并且对结果感到满意?有什么问题...?
-
@LeeGunn 这是马马虎虎。我到处使用它,但总的来说非常谨慎。原因(a)是错误处理(@Reactgular 在下面详细解释),(b)代码“嵌套”少一些(没有回调),但收益非常小,并且(c)我们正在使用代码库中有几个“真实”的 Observables(不断更新)——
await无济于事,我们最终会遇到两种不一致的方式(或者让新团队成员感到困惑)。
标签: angular typescript asynchronous promise observable