在收到用户输入之前如何阻止



我正在尝试实现以下脚本:

函数

尝试执行异步调用,如果引发异常,则提示用户输入函数是否应再次运行。

如果用户输入"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"。

这是因为process.stdin操作也是异步的,所以无论你在哪里调用初始sendSignedTransaction,如果它抛出错误,该代码块中没有任何(当前)阻止函数退出。

你混合了 Promise 和经典回调代码。如果你想确保调用方等到函数完全完成,那么你可以将完整的函数转换为一个承诺,让你更好地控制它,例如

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

相关内容

  • 没有找到相关文章

最新更新