проблема с циклом - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь использовать цикл while с моей функцией util () (она закомментирована внизу кода). Когда я пытаюсь запустить программу, я застреваю в бесконечном цикле, где я не получаю дальше, чем при выходе из консоли "getProjects running"

const axios = require("axios");
const _ = require("lodash");

axios.defaults.headers.common["Private-Token"] = "iTookMyPrivateKeyOut";
const user = "yshuman1";
let projectArray = [];
let reposExist = true;

async function getProjects() {
  console.log("getProjects running");
  await axios
    .get(`https://gitlab.com/api/v4/users/${user}/projects`)
    .then(function(response) {
      const arr = _.map(response.data, "id").forEach(repo => {
        projectArray.push(repo);
      });
      console.log(projectArray);
    });
}

function deleteRepo(projectArray) {
  console.log("array size", projectArray.length);
  const arr = _.map(projectArray).forEach(item => {
    axios
      .delete(`https://gitlab.com/api/v4/projects/${item}`)
      .then(() => {
        console.log("deleted project ID: ", item);
      })
      .catch(error => {
        console.log(error);
      });
  });
}

function util() {
  getProjects()
    .then(() => {
      if (projectArray.length == 0) {
        reposExist = false;
      }
      if (projectArray.length < 20) {
        console.log("array is less than 20");
        reposExist = false;
      }
      deleteRepo(projectArray);
    })
    .catch(error => {
      console.log(error);
    });
}

// while (reposExist) {
//   util();
// }

1 Ответ

0 голосов
/ 27 июня 2018

Цикл while является синхронным, в то время как все в любом .then (или обещании await) будет асинхронным. Начальный поток никогда не прекратится. Ваш код просто поставит в очередь неограниченные звонки на getProjects, что будет console.log.

Простым решением было бы выяснить, как часто вы хотите вызывать util (раз в секунду? Раз в 5 секунд?) И await a Promise, которые разрешаются после этого количества времени на каждой итерации.

let reposExist = true;
function util() {
  console.log('running');
}

const resolveAfter5 = () => new Promise(res => setTimeout(res, 5000));
(async () => {
  while (reposExist) {
    util();
    await resolveAfter5();
  }
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...