Бесконечный цикл при выполнении запроса Axios GET - цикл не закрывается - PullRequest
1 голос
/ 01 октября 2019

Я довольно большой новичок, когда дело доходит до работы с API и обещаниями - так что мне трудно обдумать эту проблему.

Цель - сделать запрос GET дляAPI и получить эти результаты. Тем не менее, поскольку API распределяет данные по нескольким страницам, я буду циклически проходить по страницам API, пока не вернусь к 0 спискам. цикл внутри loopThroughListings, кажется, никогда не закрывается, несмотря на то, что для listsExist задано значение false.

Где я ошибся?

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

1 Ответ

2 голосов
/ 01 октября 2019

Вам понадобится 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);

Но это всего лишь вопрос мнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...