在array.filter中调用Deezer API无返回结果的问题如何解决?
你的推测完全正确,Array.filter 是同步方法,只会同步判断回调函数的返回值是否为真值,你在回调内部的异步调用返回的 Promise 会被直接忽略,then 里的 return 也只会作用于 then 的回调函数,不会被 filter 接收,所以拿不到正确的过滤结果。
解决思路
实现带异步判断的过滤需要分两步执行:
- 先遍历所有元素执行异步判断,把所有异步操作包装成 Promise 数组
- 等待所有异步操作执行完成后,再根据返回结果做同步过滤
实现代码
// 注意:当前代码需要放在 async 函数内才能正常使用 await 语法 const judgePromises = items.map(async item => { const idAlbum = item.id_deezer.toString() // 先同步判断是否属于用户收藏 const isInFavorites = this.listOfFavorites.some(fav => fav.attributes.album_id === idAlbum) if (!isInFavorites) return null // 匹配收藏的话调用 Deezer API return await this.getHisto(item) }) // 等待所有异步请求完成,过滤掉空值得到最终结果 const filteredItems = (await Promise.all(judgePromises)).filter(Boolean) return filteredItems
优化建议
- 原代码中的循环判断逻辑可以用
Array.some简化,逻辑等价且可读性更高 - 可以给
await this.getHisto(item)加上try/catch捕获异常,避免单个接口请求失败导致整个过滤逻辑中断 - 如果 Deezer API 有并发请求限制,可以将
Promise.all替换为串行循环调用,避免触发接口限流规则
内容的提问来源于stack exchange,提问作者Reevan
相关产品推荐
相关产品推荐

