Angular等待函数执行异常:表单保存前校验联系人邮箱失败
问题分析与修复方案
核心问题
gestionMailContactos函数无返回值
该函数标记为async但未返回任何Promise或值,导致await调用后comprobar始终为undefined。- 异步订阅处理逻辑混乱
使用forEach循环发起多个HTTP订阅,存在多次调用resolve的风险,且then回调中的返回值无法传递到函数外部。
修复后的代码
1. 修正gestionMailContactos函数
async gestionMailContactos(contacto): Promise<boolean> { // 将每个Observable请求转为Promise,统一处理 const contactPromises = contacto.map(element => this.formularioService.getContacto(element).toPromise() ); // 等待所有请求完成(无论成功失败) const results = await Promise.allSettled(contactPromises); // 校验是否至少有一个联系人存在有效邮箱 const hayMail = results.some(result => result.status === 'fulfilled' && result.value?.email !== null ); if (!hayMail) { Swal.fire({ title: 'Alta Inmueble', text: 'Al menos un contacto debe tener email', icon: 'warning' }); return false; } return true; }
2. 修正表单保存函数的调用逻辑
const comprobar = await this.gestionMailContactos(altaRaw['contactos']); // 直接判断返回结果,无需额外then嵌套 if (!comprobar) { return false; }
关键修复说明
- 统一异步处理:将RxJS的
Observable转为Promise,使用Promise.allSettled确保所有请求完成后再进行校验,避免并发请求导致的逻辑混乱。 - 明确返回值:函数直接返回布尔类型的Promise,
await调用后可直接获取校验结果。 - 严谨的邮箱校验:使用
some方法判断是否存在有效邮箱,同时处理请求失败的情况(跳过失败的请求)。
内容的提问来源于stack exchange,提问作者Befhineo
相关产品推荐
相关产品推荐

