代码运行正常但ESLint报no-misused-promises错误,该如何修复?
问题原因
- 第一个错误来自你给
Promise构造函数传入了async修饰的executor回调:Promise构造器会忽略executor的返回值,你传入async函数时它返回的Promise会被直接丢弃,既不符合no-misused-promises的规则,同时这里手动包装Promise属于冗余写法。 - 第二个错误来自你给
forEach传入了async回调:forEach方法不会处理回调返回的Promise,只会同步执行所有回调就立刻返回,除了触发linter报错外,你的代码还存在隐藏逻辑bug——你调用resolve(result)的时候,依赖的异步查询请求大概率还没执行完成,result并没有合并到依赖的符号数据,你觉得运行正常只是测试场景下异步请求响应快导致的巧合。
修改方案
直接将方法改写为async方法,同时把forEach替换为for...of串行执行,或者用Promise.all并发执行依赖查询,等所有异步操作完成后再返回结果,即可同时解决linter报错和隐藏的逻辑问题。
以下是优化后的代码示例(并发版本,性能更优):
public async getAllSymbols(type?: typeof Symbol, localOnly = false): Promise<Set<Symbol>> { let result = await super.getAllSymbols(type ?? Symbol, localOnly); if (!localOnly) { // 并发请求所有依赖的符号 const depSymbolList = await Promise.all( this.dependencies.map(dependency => dependency.getAllSymbols(type, localOnly)) ); // 合并所有依赖的查询结果 for (const depSymbols of depSymbolList) { result = new Set([...result, ...depSymbols]); } } return result; }
如果需要按顺序串行执行依赖查询,可以把依赖处理部分替换为for...of写法:
if (!localOnly) { for (const dependency of this.dependencies) { const depSymbols = await dependency.getAllSymbols(type, localOnly); result = new Set([...result, ...depSymbols]); } }
内容的提问来源于stack exchange,提问作者Mike Lischke
相关产品推荐
相关产品推荐

