.push()在throw下不起作用,它使用async await方法在javascript中的循环中获取数据



我正在尝试使用async await按顺序逐个获取数据,并将response.json推送到数组中。但是,我在下面使用的代码不会在console.log(b);中显示结果。有人知道问题出在哪里吗?

提前谢谢!

async function fetch_data(){
let b = [];

for (let i = 1; i < 10; i++) {
let response = await fetch('https://SOME_URL/' + i, {
method: "GET",
headers: {"Key": "123456"}})

if (!response.ok) {
var error_detail = `An error has occured: ${response.status}`;
throw new Error(error_detail);
}
var data = await response.json();
// await b.push(data);
b.push(data);
}
// await Promise.all(b).then(function (b) {
//         console.log(b)})
console.log(b);
return b;
}

当我运行脚本时,它不会在控制台中返回任何内容

fetch_data().catch(error => {
error.error_detail;
});

更新:使用我下面的答案似乎已经解决了。但不知道为什么。

console.log(b);不显示输出的问题是因为例如'https://SOME_URL/' + i随着i的增加而增加,IF当i = 5并且它返回错误时,则console.log(b);将不返回任何内容。如果我设置了i < 5,那么console.log(b);将返回输出b。因此,这意味着,如果循环中的任何提取都在i的限制内返回错误,那么推送将不起作用(b将为空(,因此console.log(b);将不会返回任何内容。

有人知道怎么解决这个问题吗?

您需要重命名您的函数。您得到的错误是Maximum call stack size exceeded,因为当您在循环中调用fetch时,实际上您调用的是外部函数,而不是您想要的函数。

我更新了几个地方问题之一将是函数名称:;获取";与默认的获取函数名称相同。

const fetchData = async(symbol) => {
try {
let promiseGroup = [];
const subFetch = async(i) => {
const BASE_URL = `https://reqres.in/api/products`
return fetch(`${BASE_URL}/${i}`, {
method: "GET",
headers: {
"Key": "123456"
}
}).then(res => res.json())
}
for (let i = 1; i < 10; i++) {
promiseGroup.push(i);
}   
const results = await Promise.all(promiseGroup.map(subFetch))
console.log(results)
return result;
} catch (error) {
const error_detail = `An error has occured: ${error}`;
throw new Error(error_detail);
}
}
console.log(fetchData())

这里有一个工作版本(至少对我来说有效(:基本上,我只是删除了标题并将其缩进一点,所以您的示例应该也能工作。也许你在后端有问题?

async function fetch_data() {
let b = [];
for (let i = 1; i < 10; i++) {
let response = await fetch('https://jsonplaceholder.typicode.com/todos/' + i, {
method: "GET",
});
if (!response.ok) {
var error_detail = `An error has occured: ${response.status}`;
throw new Error(error_detail);
}
var data = await response.json();
// await b.push(data);
b.push(data);
}
console.log(b);
return b;
}
fetch_data()
.then(data => console.log(data.length))
.catch(err => console.error(err));

throw new Error(error_detail);更改为break似乎解决了问题并能够显示结果。

最新更新