TypeScript中Promise循环计数正常但返回值始终为0怎么解决
问题根因
你代码中的fetchValuesFromQuery是异步接口调用,本身返回Promise。你通过forEach遍历触发所有异步请求后,没有等待这些请求执行完成就直接调用了resolve,此时所有fetchValuesFromQuery的then回调都还没触发,计数变量还是初始的0值,所以返回结果恒为0。
除此之外你的实现还有两个隐含问题:
- 用外部全局变量存储计数结果,并发调用
finalRecount时会出现变量污染,计数结果错乱 - 空的catch会静默吞掉接口请求错误,无法排查异常
修复后的实现代码
export function finalRecount(): Promise<number> { return getStoredValues().then(async (resultsFound) => { // 把所有查询请求包装为Promise数组 const fetchTasks = resultsFound.map(query => { return fetchValuesFromQuery(query.query) .then(queryResults => queryResults.values.length) .catch(err => { console.error('查询数据失败:', err) // 失败的请求默认计数为0,可根据业务需求调整逻辑 return 0 }) }) // 等待所有请求完成后累加结果 const resultCounts = await Promise.all(fetchTasks) const totalCount = resultCounts.reduce((sum, current) => sum + current, 0) console.log('Total values ' + totalCount) return totalCount }) }
调用方式修正
你原来的调用代码漏了函数执行括号,修正后如下:
finalRecount().then((counter) => { console.log(counter) // 输出正确的总计数 })
补充说明
- 移除了全局计数变量,所有计数逻辑在函数内部完成,避免并发调用时的变量污染问题
- 用
Promise.all批量等待所有异步请求完成,保证累加时所有接口结果都已返回 - 保留错误捕获逻辑,增加错误日志方便排查问题,避免异常被静默忽略
- 去掉了冗余的外层Promise嵌套,直接返回
getStoredValues的Promise链式调用即可,代码更简洁
内容的提问来源于stack exchange,提问作者Nonyck
相关产品推荐
相关产品推荐

