Как я могу заблокировать до получения пользовательского ввода? - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь реализовать следующий скрипт:

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

Если пользователь вводит «y», то процедура должна повториться.

Если пользователь вводит «n», процедура должна завершиться.

Если ни того, ни другого, вопрос должен повториться.

Выполнение всего моего скрипта должно блокироваться, пока пользователь не введет "y" или "n".

Вот что у меня есть (с помощью этот ответ ):

async function sendSignedTransaction(rawTransaction) {
    try {
        return await web3.eth.sendSignedTransaction(rawTransaction);
    }
    catch (error) {
        process.stdout.write(error.message + "; try again (y/n)?");
        process.stdin.on("data", async function(data) {
            switch (data.toString().trim()) {
                case "y": return await sendSignedTransaction(rawTransaction);
                case "n": process.exit();
                default : process.stdout.write("try again (y/n)?");
            }
        });            
    }
}

Проблема в том, что выполнение скрипта продолжается без ожидания, пока пользователь не введет "y" или "n".

Буду очень признателен за любую помощь.

Спасибо !!!

1 Ответ

0 голосов
/ 06 января 2019

Это потому, что process.stdin операции также асинхронны, поэтому, где бы вы ни вызывали начальную sendSignedTransaction, если она выдает ошибку, в этом блоке кода нет ничего (на данный момент), что мешает выходу из функции .

У вас есть смесь Promise и классического кода обратного вызова. Если вы хотите убедиться, что вызывающая сторона ждет, пока функция полностью не завершит 1008 *, вы можете преобразовать полную функцию в Обещание, которое дает вам больший контроль над ней, например,

function sendSignedTransaction(rawTransaction) {
  return new Promise(async (resolve, reject) => {
    try {
      const result = await web3.eth.sendSignedTransaction(rawTransaction);
      return resolve(result);
    } catch (e) {
      process.stdout.write(e.message + "; try again (y/n)?");
      process.stdin.on('data', async data => {
        switch (data.toString().trim()) {
          case "y": return resolve(await sendSignedTransaction(rawTransaction));
          case "n": return process.exit();
          default : return process.stdout.write("try again (y/n)?");
        }
      });
    }
  });
}
...