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()
是否可以在 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()