【问题标题】:How to set up a Form submit button tied to service call that must finish before submission in Angular/TypeScript?如何设置与服务调用绑定的表单提交按钮,该按钮必须在 Angular/TypeScript 中提交之前完成?
【发布时间】:2021-10-18 03:19:55
【问题描述】:

我正在尝试设置表单提交,其中表单本身包含一个字段,该字段在应用程序的其他地方使用,因此有自己的服务与之相关联。我的目标是为表单设置提交按钮以执行该特定字段的服务调用,等待它完成并成功响应,然后继续执行常规表单提交逻辑。

这是我迄今为止尝试过的简化版本:

async onSubmit(form) {
    if(specialField) {
        const response = await this.updateSpecialField();
    }
    // I will leave the rest of the form submission abstracted away
}

async updateSpecialField() {
    this.specialService.updateField().subscribe(then => {
        this.specialService.loadingFields$.subscribe(data => {
            this.loading = data;
        });
    });
}

在这种情况下,服务调用是在后台进行的,并且总是在表单提交完成后完成。由于我没有走这条路,所以我尝试使用 await 并承诺在继续之前完成服务调用。

下面是同一个 updateSpecialField 函数的不同方法:

async updateSpecialField() {
    let updatedFieldResponse = await this.specialService.updateField().toPromise();
    return Promise.resolve(updatedFieldResponse);
}

在这种情况下,返回行似乎永远不会执行,表单提交也不会发生。我从服务中获得了成功的响应,但它没有从我期望的位置恢复执行代码行。

【问题讨论】:

    标签: javascript angular typescript async-await


    【解决方案1】:

    试试这个

    async onSubmit(form) {
        if(specialField) {
            const response = await this.updateSpecialField();
        }
        // I will leave the rest of the form submission abstracted away
      }
      
      async updateSpecialField() {
        return this.specialService.updateField().pipe(
                  switchMap((_: any) =>
                    this.specialService.loadingFields$.toPromise().then(data => {
                        this.loading = data;
                    })
                  )
                ).toPromise();
      }
    

    【讨论】:

      猜你喜欢
      • 2013-12-21
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 2017-05-07
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多