发出 Axios GET 请求时出现无限循环 - 循环不会关闭

Posted

技术标签:

【中文标题】发出 Axios GET 请求时出现无限循环 - 循环不会关闭【英文标题】:Infinite loop when making Axios GET Request - Loop Won't Close 【发布时间】:2020-01-30 12:00:46 【问题描述】:

在使用 API 和 Promise 方面,我是一个相当大的新手 - 所以我很难解决这个问题。

目标是向 API 发出 GET 请求并返回这些结果。但是,由于 API 将数据分散到多个页面,因此我将遍历 API 页面,直到返回 0 个列表。

我能够成功地将列表记录到控制台,但是,尽管将 listingsExist 设置为 false,但 loopThroughListings 中的 while 循环似乎永远不会关闭。

我哪里做错了?

const axios = require('axios');

// Loop through multiple pages of listings in the API
function loopThroughListings() 
  let listingsExist = true;

  // Loop through listings until they don't exist
  while(listingsExist) 

    getListing().then(function(listing) 

      if(listing.length < 1 ) 
        // if listings don't exist, stop the loop
        // THIS IS WHERE THE ISSUE IS
        console.log("No Listings");
        listingsExist = false;
       else 
        // if listings do exist, log them to console
        console.log(listing);
      

    );

  


// Return listing data from API
async function getListing(page) 
  try 
    const response = await axios.get(`https://mlb19.theshownation.com/apis/listings.json?type=Stadium&page=1`);
    return response.data.listings;
   catch (error) 
    console.error(error);
  


loopThroughListings();

【问题讨论】:

getListing() 是异步的,因此 axios.get 永远不会完成执行,因为您实际上有一个 while(true) 循环 【参考方案1】:

你需要loopThroughListings 成为async 然后你可以await getListing()

像这样:

const axios = require('axios');

// Loop through multiple pages of listings in the API
async function loopThroughListings() 
    let listingsExist = true;

    // Loop through listings until they don't exist
    while (listingsExist) 
        const listing = await getListing();
        if (listing.length < 1) 
            // if listings don't exist, stop the loop
            // THIS IS WHERE THE ISSUE IS
            console.log("No Listings");
            listingsExist = false;
         else 
            // if listings do exist, log them to console
            console.log(listing);
        
    


// Return listing data from API
async function getListing(page) 
    try 
        const response = await axios.get(`https://mlb19.theshownation.com/apis/listings.json?type=Stadium&page=1`);
        return response.data.listings;
     catch (error) 
        console.error(error);
    


loopThroughListings();

就个人而言,因为 while 循环当然会至少运行一次,所以我会改用 do/while - 对我来说,它使代码流更加明显

    do 
        const listing = await getListing();
        if (listing.length < 1) 
            // if listings don't exist, stop the loop
            // THIS IS WHERE THE ISSUE IS
            console.log("No Listings");
            listingsExist = false;
         else 
            // if listings do exist, log them to console
            console.log(listing);
        
     while(listingsExist);

但这只是一个见仁见智的问题

【讨论】:

以上是关于发出 Axios GET 请求时出现无限循环 - 循环不会关闭的主要内容,如果未能解决你的问题,请参考以下文章

发出帖子请求时出现Vuejs axios错误

向 Spotify API 发出 PUT 请求时出现 401 错误

在 Express.js 上使用 Axios 向 Spotify API 发出 POST 请求时出现错误 400

执行带有axios的GET请求时出现401错误

使用 Auth Headers 发送 axios get 请求时出现 401 错误

发出 GET 请求时没有 CORS 错误,但发出 POST 请求时出现 CORS 错误