下面是我输入的代码,用于遍历数组并将所需的数据粘贴到输出数组中,然后最终返回输出数组:
var stocks = ['AAPL', 'BMY']
let getInfo = arr => {
let output = []
arr.forEach(i => {
var root = 'https://fmpcloud.io/api/v3/profile/' + i + '?apikey=myAPIKey'
axios.get(root)
.then((data) => {
output.push(data.data)
})
.catch((e) => {
console.log('error', e)
})
})
console.log('output: ', output)
return output
}
getInfo(stocks)
console.log 只记录一个空数组,这让我觉得它在 for 循环完成执行之前转到 return 语句。有没有人知道先完成 for 循环,然后最后返回输出数组的最佳方法?
答案 0 :(得分:1)
那是因为 axios 是异步方法,return 语句应该在 axios().then()
之前返回。
使用 Promise.all() 和使用 async/await
var stocks = ['AAPL', 'BMY']
let getInfo = async arr => {
let output = []
const promises = []
arr.forEach(i => {
var root = 'https://fmpcloud.io/api/v3/profile/' + i + '?apikey=myAPIKey'
promises.push(axios.get(root))
.then((data) => {
output.push(data.data)
})
.catch((e) => {
console.log('error', e)
})
})
const result = await Promise.all(promises)
output = result.map(r => r.data)
console.log('output: ', output)
return output
}
getInfo(stocks)
答案 1 :(得分:1)
你可以使用 async/await 关键字让 axios 调用等待。喜欢:
let getInfo = async arr => {
let output = []
try {
for(var i in arr) {
var root = 'https://fmpcloud.io/api/v3/profile/' + arr[i] + '?apikey=myAPIKey'
var data = await axios.get(root);
output.push(data.data);
}
}
catch(e) {
// oops
console.log('error', e);
return null;
}
return output;
}
答案 2 :(得分:0)
Axios.get
返回一个 promise,它异步执行,而 lambda 的其余部分继续执行。
查看 Promise.all()
以便您可以在所有 promise 解决后记录输出。
答案 3 :(得分:0)
var stocks = ["AAPL", "BMY"];
let getInfo = async (arr) => {
const output = await Promise.all(
arr.map(
(i) =>
new Promise(async (resolve, reject) => {
try {
const { data } = await axios.get(
`https://fmpcloud.io/api/v3/profile/${i}?apikey=myAPIKey`
);
resolve(data);
} catch (err) {
reject(err);
}
})
)
);
console.log("output: ", output);
return output;
};
getInfo(stocks);
答案 4 :(得分:-1)
不要使用 forEach。使用 for/of 循环。接下来,使用 async/await 在 axios 调用。应该这样做。