.push() 在 throw 下不起作用,使用 async await 方法在循环中获取数据 javascript
.push() does not work under throw, using async await method to fetch data in a loop in javascript
我正在尝试使用异步等待一个一个地获取数据并将 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;
}
当我 运行 脚本时,它 return 控制台中没有任何内容
fetch_data().catch(error => {
error.error_detail;
});
更新:似乎使用我下面的回答解决了。不知道为什么。
console.log(b);
不显示输出的问题是因为例如 'https://SOME_URL/' + i
随着 i
的增加,如果 i = 5
和它 returns错误,那么 console.log(b);
将不会 return 任何东西。如果我设置 i < 5
,那么 console.log(b);
将 return 输出 b。所以这意味着如果循环中的任何提取 returns 错误在 i
的限制内,那么推送将不起作用(b 将为空)因此 console.log(b);
不会 return任何东西。
有人知道如何解决这个问题吗?
您需要重命名您的函数。您得到的错误是 Maximum call stack size exceeded
,因为当您在循环内调用 fetch
时,您实际上调用了外部函数,而不是您想要的函数。
这是一个可用的版本(至少对我有用):
基本上我只是删除了 header 并缩进了一点,所以你的例子应该也能工作。也许您在后端遇到了一些问题?
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
似乎解决了问题并能够显示结果。
我更新了几个地方
问题之一是函数名称:“fetch”与默认的 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())
我正在尝试使用异步等待一个一个地获取数据并将 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;
}
当我 运行 脚本时,它 return 控制台中没有任何内容
fetch_data().catch(error => {
error.error_detail;
});
更新:似乎使用我下面的回答解决了。不知道为什么。
console.log(b);
不显示输出的问题是因为例如 'https://SOME_URL/' + i
随着 i
的增加,如果 i = 5
和它 returns错误,那么 console.log(b);
将不会 return 任何东西。如果我设置 i < 5
,那么 console.log(b);
将 return 输出 b。所以这意味着如果循环中的任何提取 returns 错误在 i
的限制内,那么推送将不起作用(b 将为空)因此 console.log(b);
不会 return任何东西。
有人知道如何解决这个问题吗?
您需要重命名您的函数。您得到的错误是 Maximum call stack size exceeded
,因为当您在循环内调用 fetch
时,您实际上调用了外部函数,而不是您想要的函数。
这是一个可用的版本(至少对我有用): 基本上我只是删除了 header 并缩进了一点,所以你的例子应该也能工作。也许您在后端遇到了一些问题?
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
似乎解决了问题并能够显示结果。
我更新了几个地方 问题之一是函数名称:“fetch”与默认的 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())