javascript - 如何设置与服务调用绑定的表单提交按钮,该按钮必须在 Angular/TypeScript 中提交之前完成?
问题描述
我正在尝试设置表单提交,其中表单本身包含一个在应用程序其他地方使用的字段,因此有自己的服务与之相关联。我的目标是为表单设置提交按钮以执行该特定字段的服务调用,等到它完成并成功响应,然后继续执行常规表单提交逻辑。
这是我迄今为止尝试过的简化版本:
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);
}
在这种情况下,返回行似乎永远不会执行,并且表单提交也不会发生。我从服务获得了成功的响应,但它没有从我期望的位置恢复执行代码行。
解决方案
尝试这个
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();
}
推荐阅读
- django - 结合两个变量过滤器 Django
- powershell - 调用多个脚本时不发送电子邮件
- javascript - 如何在 JavaScript 中将 HTML 页面转换为多页 PDF
- python - 如何更优雅地将字典列表转换为另一种格式?
- html - angular 7中的数据更改时如何更新angular-plotly.js图
- r - R中的gam():它是具有自动结选择的样条模型吗?
- html - 为什么我不能增加这个 div 的高度(使用引导程序)?
- mysql - 在 SQL 中对不同的合并列进行排序
- reactjs - axios POST请求到strapi图像上传[内部服务器错误]
- python - 新列表 = 列表 - 自我