You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular等待函数执行异常:表单保存前校验联系人邮箱失败

问题分析与修复方案

核心问题

  1. gestionMailContactos函数无返回值
    该函数标记为async但未返回任何Promise或值,导致await调用后comprobar始终为undefined。
  2. 异步订阅处理逻辑混乱
    使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:27:46