继续循环执行一个函数,直到内部的回调解析为true

时间:2019-07-09 16:20:48

标签: javascript while-loop async-await

我有两个相互关联的功能。

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

我需要保持第一个功能运行,直到输入的地址正确并且第二个功能解析为true。我尝试了以下方法。

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

如果我输入正确的地址,该函数将按预期运行,错误的地址会破坏它,但是我希望它继续循环直到地址正确。要更改正确的行为,我需要更改什么?

1 个答案:

答案 0 :(得分:0)

您的“主要” newRunner(在您的问题顶部)仅在auth.newRunner满足时满足,否则就拒绝。 auth.newRunner仅在成功获取数据时满足。因此,要循环执行直到成功获取数据,您需要将调用包装在try / catch中:

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

不过,最好对此设置一些限制,以免无限循环。