Fastify的async/await handler处理Moralis数据返回空数组如何解决
问题根因
返回空数组的问题完全是异步执行逻辑错误导致的:
Array.prototype.forEach方法本身不支持等待异步任务,你在循环内部用.then()触发的getTokenPair、checkTokenPrice都是异步接口调用,这些任务会被推入事件循环队列等待执行,主线程不会等待它们完成,就会直接执行后面的sort排序和return userBalances逻辑,此时数组还没有被任何异步回调写入数据,所以返回空。- 你最终实现里改用
for...of循环配合await串行执行每个token的校验逻辑,相当于强制主线程等待每个token的异步校验全部完成后,再往下执行返回逻辑,自然就能拿到正确的过滤结果。
可选优化点
1. 正则简化
原来的6条名称过滤正则可以合并为1条,开启不区分大小写匹配即可,代码更简洁:
if (!token.name.match(/^.*\.(io|net|com|org)$/i))
2. 性能优化
当前for...of是串行处理所有token,如果token数量较多接口调用耗时会很长,可以改用Promise.all并行处理所有校验任务,提升接口响应速度:
// 先过滤掉名称不符合要求的token,再批量生成异步校验任务 const filterTasks = userTokens .filter(token => !token.name.match(/^.*\.(io|net|com|org)$/i)) .map(async token => { const value = await getTokenPair(token) if (value <= 2) return null const price = await checkTokenPrice(token) return price > 0.001 ? token : null }) // 等待所有任务执行完成,过滤掉不符合要求的空值 const userBalances = (await Promise.all(filterTasks)).filter(Boolean) // 按USD估值降序排序 userBalances.sort((a, b) => b.total_value_usd - a.total_value_usd)
内容的提问来源于stack exchange,提问作者Jo Le Belge
相关产品推荐
相关产品推荐

