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();