我需要同时执行HttpClient个GET请求,所以我在网上找到了一个解决方案,用toPromise代替订阅,然后等待. 然而,我注意到this.form = = this.formBuilder.group行代码在myAccountasync调用初始化之前执行. 换句话说,我预计执行代码将阻塞,直到this.myAccount被初始化,然后开始执行this.form = this.formBuilder.group行. 我理解的Async/AWait中的Java脚本是否正确.我需要做什么来实现我想要的--即,等待执行,直到this.myAccount被调用await this.accountService.getById(this.id).toPromise()初始化.

ngOnInit(): void {
    this.getByIdSynchronously();

    this.form = this.formBuilder.group({
      scheduledDate: ['', Validators.required],
      required: [''],
      userAvailability: [''],
    });
}
async getByIdSynchronously()
  {
    this.myAccount = await this.accountService.getById(this.id).toPromise();
  }

我还有一个html页面,第一行代码如下所示:

<form [formGroup]="form" (ngSubmit)="onSubmit()" *ngIf="!isAdmin">
...
</form >

其中,isAdmin是本地函数:

get isAdmin()
  {
    if(this.myAccount)
    {
      return this.myAccount.role == Role.Admin;
    }
    else{
      return true;
    }
  }

在我的异步/等待方法完成之前,它会执行十几次,所以我必须返回一些人为的真值,直到我的this.myAccount被初始化.

Note

我已经找到了第一个问题的解决方案--只需使用then运营商的promise .我找不到第二个问题的解决方案--在this.myAccount被初始化之前停止从模板html调用isAdmin.对此有什么补救措施吗?

推荐答案

代替promise ,你应该使用可见物作为Angular 也鼓励使用可观察物. HTTPClient返回一个可观察对象,因此您可以改为订阅它.

AccountService

    getById(id: number): Observable<any> {
        return this.httpClient.get(`URL goes here. ID goes into PARAMS`);
    }

然后在您的组件中订阅您的API调用.您可以使用另一个变量来阻止isAdmin被连续调用.

isLoaded: boolean = false;
ngOnInit(): void {
      this.accountService.getById(this.id).subscribe(resp=>{
          this.form = this.formBuilder.group({
          scheduledDate: ['', Validators.required],
          required: [''],
          userAvailability: [''] });
          this.isLoaded = true;
      });
}
<form [formGroup]="form" (ngSubmit)="onSubmit()" *ngIf="isLoaded && !isAdmin">
...
</form>

Javascript相关问答推荐

WebGL 2.0无符号整数输入变量

如何根据当前打开的BottomTab Screeb动态加载React组件?

如何在JavaScript文件中使用Json文件

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

保持物品顺序的可变大小物品分配到平衡组的算法

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

使用NextJS+MongoDB+Prisma ORM获取无效请求正文,无法发布错误

一个实体一刀VS每个实体多刀S

将对象推送到数组会导致复制

第一项杀死下一项,直到数组长度在javascript中等于1

匹配一个或多个可选重复的特定模式

select 2-删除js插入的项目将其保留为选项

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

表单数据中未定义的数组键

如何在Highlihte.js代码区旁边添加行号?

如何用react组件替换dom元素?

验证Java脚本函数中的两个变量

在AgGrid中显示分组行的单元格值

如何在单击链接时设置一个JavaScript变量(以打开弹出窗口的特定部分)

我正在为我的单选按钮在HTML中设置一个值.使用Java脚本,我如何才能获得该值?