for循环中的插值(axios请求)

Interpolation in a for loop (axios request)

是否可以在 for 循环中插入值?我正在使用 axios,我希望它在完成一个循环后进入下一个 json 文件,获取数组的下一个值;这些是我的尝试(无效)

我的第一次尝试是:

const axios = require('axios')
const array = [foo, bar, baz];
(async()=>{
    for(i=0;i<array.length;i++){
        const res = await axios.get(`https://blabla/${array[i]}.json`)
        // actions
    }
})()

但是 axios 以这种方式发出请求,仅插入数组的最后一个元素(在本例中为 "baz"),而我希望它使用 "foo" 发出第一个请求,然后,当它已完成所有操作,它向 "bar" 发出第二个请求,依此类推直到 "baz"

我的第二次尝试是:

const axios = require('axios')
const array = [foo, bar, baz];

array.forEach(async function(item){
    const res = await axios.get(`https://blabla/${item}.json`)
    //actions
})

但是使用这段代码我得到错误“TypeError: Cannot set property 'res' of undefined

我能做什么?

你可以在i前加上let,这样会使其在本地可见,你不会只得到最后一个元素

for(let i=0; i < array.length; i++){

但最好不要使用阻塞的 await,而是使用

Promise.all(
  array.map(v => axios.get(`https://blabla/${v}.json`))
).then(resp => resp.forEach(v => 
 //...some action with each result
))

您绝对确定第一种方法行不通吗?因为它对我有用。我做了一个玩具示例来展示这里会发生什么:

var axios = {
  get: async function(url) {
    await new Promise(r => setTimeout(r, 150));
    console.log('axios url', url);
  }
}
var array = ['foo', 'bar', 'baz'];
(async()=>{
    for(i=0;i<array.length;i++){
        const res = await axios.get(`https://blabla/${array[i]}.json`)
        // actions
    }
})()

对我来说,它等待 150 毫秒并记录 'foo'、'bar',然后 'baz' urls

您的代码有效。您当然应该将 for (i = 0 更改为 for (let i = 0 但这不会影响输出。在您的 api 数据数组中查找错误。请参阅我的 jsonplaceholder

示例
const axios = require('axios')
const f = async () => {
  const array = ['1', '2', '3']
  for (let i = 0; i < array.length; i++) {
    const res = await axios.get(`https://jsonplaceholder.typicode.com/users/${array[i]}`)
    console.log(res.data.name)
  }
}
f()

您的第一个示例和第二个示例之间的区别在于,第一个示例将 运行 顺序请求,而第二个示例将 运行 并行请求。更惯用的方法是使用 Promise.all

const axios = require('axios')
const f = async () => {
  const array = ['1', '2', '3']
  const response = await Promise.all(array.map(i => axios.get(`https://jsonplaceholder.typicode.com/users/${i}`)))
  const data = response.map(item => item.data)
  console.log(data)
}
f()