продолжайте зацикливать функцию до тех пор, пока обратный вызов внутри не станет истинным - PullRequest
0 голосов
/ 09 июля 2019

У меня есть две взаимосвязанные функции.

module.exports = async function newRunner() {
  console.log('No Config found. Requesting new Runner ID');

  if (!process.env.ADDRESS) {
    const a = await inquirer.prompt([
      {
        type: 'input',
        message: 'Enter the runner api address',
        name: 'address',
      },
    ]);

    config.ADDRESS = a.address;
  } else {
    config.ADDRESS = process.env.ADDRESS;
  }

  config.save();

  const res = await auth.checkAddress();

  console.log('New Runner ID', res.id);

  config.ID = res.id;
  config.TOKEN = res.token;
  config.save();
};

В строке const res = await auth.newRunner(); вызывается следующая функция:

exports.checkAddress = args => new Promise((resolve, reject) => {
  const cArgs = {
    data: args,
    path: {},
    parameters: {},
    headers: {
      'Content-Type': 'application/json',
    },
  };

  client.post(`${config.ADDRESS}/new-runner`, cArgs, (data, response) => {
    if (response.statusCode !== 200) return reject(new Error(`Status code ${response.statusCode}`));
    return resolve(data);
  })
    .on('responseTimeout', (res) => {
      console.log('Update Response Timeout!', res);
      reject(new Error('response has expired'));
    })
    .on('error', (err) => {
      reject(err);
    });
});

Мне нужно, чтобы первая функция работала до тех пор, пока введенный адрес не будет правильным, а вторая функция не станет истинной.Я пробовал следующее.

 await newRunner();
    while (!await auth.newRunner()) {
      await newRunner();
    }

Функции запускаются как надо, если я введу правильный адрес, неправильный адрес сломает его, но я хочу, чтобы он продолжал работать до тех пор, пока адрес не будет правильным.Что мне нужно изменить, чтобы в архиве было правильное поведение?

1 Ответ

0 голосов
/ 09 июля 2019

Ваш "главный" newRunner (вверху вашего вопроса) выполняет только тогда, когда auth.newRunner выполняет, и отклоняет иначе.auth.newRunner выполняется только тогда, когда он успешно получил данные.Таким образом, чтобы зацикливаться до тех пор, пока вы успешно не получите данные, вам нужно обернуть вызов в try / catch:

let failed;
do {
    try {
        await newRunner();
        failed = false;
    } catch {
        failed = true;
    }
} while (failed);

Возможно, было бы лучше наложить на это некоторые ограничения, поэтомуне может вращаться бесконечно.

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