FetchAPI 并行 API 调用,使用 for 循环制作 URL 数组不起作用,手动数组起作用。不明白为什么
FetchAPI parallel API calls, making URL array with for loop doesn't work, manual array works. Can't understand why
我试图形成一个 url 数组,然后使用 .map 和 Promise.all 执行并行提取
如果我尝试使用手动制作的数组,代码本身就可以工作,但如果我尝试使用 for 循环形成一个数组(用于分页),则代码本身不起作用。
我从第一次获取的 headers 中获得最大页数,并使用该数字使用 for 循环添加编号递增的页面,直到页面的最终数量。
我意识到试图在这里做一个最小可重现的例子,从某种意义上说,这不是 'working',当我在我的服务器上使用这个示例代码执行此操作时,它可以工作并且
console.log(urls);
实际上显示了循环的 urls 并且它似乎是数组格式,因为我使用 push 似乎不可能不是?但是话又说回来,当执行 urls.map 它根本不起作用并尝试做其他事情时,比如 .slice 到 urls 它也不起作用,所以我感觉到我'我认为我没有形成阵列?
想不通了。
async function smt() {
var url = 'https://jsonplaceholder.typicode.com/todos/';
var urls = [];
var firstFetch = fetch(url)
.then(function(e) {
var maxpages = 5;
//var maxpages = e.get.headers('TotalPages'); < I would get the maxpages here
for (let i = 1; i < maxpages; i++) {
urls.push(url + i)
}
});
console.log(urls);
var data = await Promise.all(urls.map(async url => {
const res = await fetch(url);
return res.json();
}))
console.log(data);
var other = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/3',
'https://jsonplaceholder.typicode.com/todos/4',
]
var data2 = await Promise.all(other.map(async url => {
const res = await fetch(url);
return res.json();
}))
console.log(data2);
}
smt();
问题出在 .then() 函数上,我一无所知,但我测试了每个部分,直到它起作用。
async function smt() {
var url = 'https://jsonplaceholder.typicode.com/todos/';
var urls = [];
var firstFetch = await fetch(url)
var maxpages = 5;
//var maxpages = firstFetch.get.headers('TotalPages'); < I would get the maxpages here
for (let i = 1; i < maxpages; i++) {
urls.push(url + i)
}
console.log(urls);
var data = await Promise.all(urls.map(async url => {
const res = await fetch(url);
return res.json();
}))
console.log(data);
var other = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/3',
'https://jsonplaceholder.typicode.com/todos/4',
]
var data2 = await Promise.all(other.map(async url => {
const res = await fetch(url);
return res.json();
}))
console.log(data2);
}
smt();
我试图形成一个 url 数组,然后使用 .map 和 Promise.all 执行并行提取 如果我尝试使用手动制作的数组,代码本身就可以工作,但如果我尝试使用 for 循环形成一个数组(用于分页),则代码本身不起作用。 我从第一次获取的 headers 中获得最大页数,并使用该数字使用 for 循环添加编号递增的页面,直到页面的最终数量。
我意识到试图在这里做一个最小可重现的例子,从某种意义上说,这不是 'working',当我在我的服务器上使用这个示例代码执行此操作时,它可以工作并且
console.log(urls);
实际上显示了循环的 urls 并且它似乎是数组格式,因为我使用 push 似乎不可能不是?但是话又说回来,当执行 urls.map 它根本不起作用并尝试做其他事情时,比如 .slice 到 urls 它也不起作用,所以我感觉到我'我认为我没有形成阵列? 想不通了。
async function smt() {
var url = 'https://jsonplaceholder.typicode.com/todos/';
var urls = [];
var firstFetch = fetch(url)
.then(function(e) {
var maxpages = 5;
//var maxpages = e.get.headers('TotalPages'); < I would get the maxpages here
for (let i = 1; i < maxpages; i++) {
urls.push(url + i)
}
});
console.log(urls);
var data = await Promise.all(urls.map(async url => {
const res = await fetch(url);
return res.json();
}))
console.log(data);
var other = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/3',
'https://jsonplaceholder.typicode.com/todos/4',
]
var data2 = await Promise.all(other.map(async url => {
const res = await fetch(url);
return res.json();
}))
console.log(data2);
}
smt();
问题出在 .then() 函数上,我一无所知,但我测试了每个部分,直到它起作用。
async function smt() {
var url = 'https://jsonplaceholder.typicode.com/todos/';
var urls = [];
var firstFetch = await fetch(url)
var maxpages = 5;
//var maxpages = firstFetch.get.headers('TotalPages'); < I would get the maxpages here
for (let i = 1; i < maxpages; i++) {
urls.push(url + i)
}
console.log(urls);
var data = await Promise.all(urls.map(async url => {
const res = await fetch(url);
return res.json();
}))
console.log(data);
var other = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/3',
'https://jsonplaceholder.typicode.com/todos/4',
]
var data2 = await Promise.all(other.map(async url => {
const res = await fetch(url);
return res.json();
}))
console.log(data2);
}
smt();