使用axios时新数组poolList上没有数据,但是console.log还有数据

Posted

技术标签:

【中文标题】使用axios时新数组poolList上没有数据,但是console.log还有数据【英文标题】:Not data on new array poolList when use axios, but console.log still have data 【发布时间】:2022-01-11 07:03:28 【问题描述】:

我在使用 axios 创建 API 时遇到了麻烦。新数组没有收到包含数据,但是当我运行 console.log(response) 时,它会显示数据(参见图片附件)。任何人都可以帮助我解决这个问题

router.get('/', async (req, res) => 
    const pools = [
        'pool1',
        'pool2',
    ]
    const poolList = pools.map(async pool => 
        const response = await axios.get(`https://example.com/pools/$pool/summary.json`)
        console.log(response)
        return 
            response
        
    )
    res.send(
        poolList
    )
)

enter image description here

【问题讨论】:

试试Promise.all(poolList).then(res.send)。您可能还希望在地图回调中使用return response.data 我试过你的评论,但仍然是同样的问题 【参考方案1】:

问题

您的poolList 是一系列承诺。然后,您尝试将这些承诺作为 JSON 进行响应。这看起来像下面这样,因为当 Promise 被字符串化时,它们变成了空对象


  "poolList": [, ]

解决方案

我怀疑你真正想要的是以下......

router.get('/', async (req, res) => 
  const pools = [
    'pool1',
    'pool2',
  ]

  try 
    const poolList = await Promise.all(pools.map(async pool => 
      const  data  = await axios.get(`https://example.com/pools/$encodeURIComponent(pool)/summary.json`)
      return data // resolve with the data, not the full Response object
    ))

    res.json( poolList )
   catch (err) 
    console.error(err)
    res.status(500).send(err)
  
)

这会创建一个用远程数据(每个summary.json)解析的承诺数组,并等待每个承诺,从而产生一个数据数组。

这会以类似的方式响应


  "poolList": [
     /* pool1/summary.json */ ,
     /* pool2/summary.json */ 
  ]

【讨论】:

返回404错误如下message: "Request failed with status code 404" message: "Request failed with status code 404" @TADA 这可能意味着您的至少一个summary.json URL 不正确 是的,我明白了,非常感谢菲尔,你的建议很棒:3【参考方案2】:

这是因为 pools.map(async pool => 中的异步。预期的 poolList 的结果是一个 promise 数组。

尝试等待所有

const pools = [
    'pool1',
    'pool2',
]
const poolList = await Promise.all(pools.map(async pool => 
    const response = await axios.get(`https://example.com/pools/$pool/summary.json`)
    console.log(response)
    return 
        response
    
));


res.send(
    poolList
)

【讨论】:

我试过你的评论,但它仍然是同样的问题:((

以上是关于使用axios时新数组poolList上没有数据,但是console.log还有数据的主要内容,如果未能解决你的问题,请参考以下文章

Vue 未使用来自 Axios 请求的数据更新数组中的 Vuetify 数据表

Laravel VueJS Axios 将数组发送到控制器

Axios 没有使用 useEffect() (React Js) [重复]

vue axios用post请求的数据data是一个数组,怎么将它渲染在页面上?

VueJS - Axios 数组未更新

vue 第一次axios请求得到一个数组,然后根据循环数组获得id进行第二次axios请求,请问如何处理速度最快?