首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角-当承诺il解决后更新HTML

角-当承诺il解决后更新HTML
EN

Stack Overflow用户
提问于 2022-10-25 16:39:21
回答 2查看 26关注 0票数 0

我对棱角和承诺有问题,我不明白。

这是我的html:

代码语言:javascript
复制
<div>Is Ready? {{isReady}}</div>
<div *ngIf="isReady">Show this</div>
<div *ngIf="!isReady">Show that</div>

这是我的TS文件:

代码语言:javascript
复制
isReady: boolean = false;

constructor(
 private myService: MyService){
 await this.giveMeSlowData();
}

async giveMeSlowData() : Promise<void>{
 console.log(await this.myService.getResult());
 this.isReady = await this.myService.getResult();
}

通常,此{{}}中的HTML中的所有内容都会在TS文件中的变量一出现变化。但不是现在。我可以在5-6秒后看到控制台日志,但是HTML不会改变。为什么?

谢谢大家!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-25 20:32:01

有几个原因可以解释为什么直到你得到你的控制台日志之后才能完成。

实际问题

您有一个从不返回任何内容的async方法。这就让Promise永远悬着。由于在构造函数中对挂起的await进行调用,组件将永远不会完成初始化。您可以通过在ngOnInit中添加日志语句来测试这一点。

建议

  1. ,我强烈地鼓励你改用一个可观察的,因为这是角度世界中的标准实践。许多与组件销毁的事情都是自动为您处理的。您甚至可以这样做,而无需更改MyService的任何逻辑,如果必须保持为Promise-based类.

,则这种逻辑非常方便。

所有初始化逻辑应该在一个constructor.方法中处理,而不是在方法中处理。

  1. I鼓励您切换到使用模板中的async管道。

解决方案

这就是所有这些都是如何结合在一起的。

slow-data.component.ts

代码语言:javascript
复制
isReady: Subject<boolean> = new BehaviorSubject(false);

constructor(
 private myService: MyService,
) {
}

ngOnInit(): void {
  giveMeSlowData();
}

giveMeSlowData(): void {
  from(this.myService.getResult()).subscribe(isReady);
}

slow-data.component.html

代码语言:javascript
复制
<div>Is Ready? {{isReady | async}}</div>
<div *ngIf="isReady | async">Show this</div>
<div *ngIf="!(isReady | async)">Show that</div>
票数 2
EN

Stack Overflow用户

发布于 2022-10-25 16:50:47

为什么要给this.myService.getResult()打两次电话?试试这个:

代码语言:javascript
复制
async giveMeSlowData() : Promise<void>{
 this.isReady = await this.myService.getResult();
 console.log(this.isReady);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74197487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档