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

Array.filter异步问题:调用异步筛选方法后后续代码未执行原因排查

问题根因分析

核心原因是getNotOverdueList方法的异常分支未正确处理Promise状态,导致Promise永久挂起(pending),await运算符持续等待Promise完成,因此后续代码永远不会执行,具体问题点如下:

  • 异常分支逻辑错误:你将try/catch写在了Promise构造函数的执行器内部,当arrayData.filter执行报错时(比如传入的arrayData是undefined/null,调用filter方法会抛出类型错误),错误会被catch块捕获,但你在catch块中直接返回了[],既没有调用resolve()也没有调用reject(),该Promise的状态永远不会变更为完成/失败,await就会一直阻塞在此处。
  • 冗余异步包装问题:数组过滤是纯同步逻辑,完全不需要额外包装为Promise,也不需要使用async/await,不必要的异步包裹大幅提升了出错概率。
修复方案

最简兼容修复(保留原有异步包装逻辑)

修改catch分支的逻辑,确保所有分支都能变更Promise状态:

async getNotOverdueList(arrayData) {
    return await new Promise((resolve, reject) => {
      try {
        resolve(arrayData.filter(s => s !== 'Overdue'));
      } catch (err) {
        this.logger.error(err);
        // 报错时也resolve空数组,保证Promise一定会进入完成状态
        resolve([]);
      }
    });
}

最优修复(移除冗余异步包装)

因为过滤逻辑是同步的,直接返回结果即可,完全不需要异步相关处理:

getNotOverdueList(arrayData: string[]) {
  try {
    return arrayData.filter(s => s !== 'Overdue');
  } catch (err) {
    this.logger.error(err);
    return [];
  }
}

调用处也不需要加await,直接写:

const withoutOverdueStatus = this.getNotOverdueList(tempSelectedStaus);

额外优化建议

  • RxJS的toPromise方法已经在v7+版本废弃,建议替换为firstValueFrom或者lastValueFrom来将Observable转为Promise
  • 尽量避免使用any类型,给变量定义明确的TS类型可以提前规避大量类型相关的运行时错误

内容的提问来源于stack exchange,提问作者DevAra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:06:04