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
相关产品推荐
相关产品推荐

