在收到用户输入之前如何阻止?
How can I block until user-input received?
我正在尝试执行以下脚本:
函数尝试执行异步调用,如果抛出异常,系统会提示用户输入函数是否应该再次 运行。
如果用户输入 "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 和经典回调代码。如果你想确保调用者等到函数 完全 完成,那么你可以将完整的函数转换为一个 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)?");
}
});
}
});
}
我正在尝试执行以下脚本:
函数尝试执行异步调用,如果抛出异常,系统会提示用户输入函数是否应该再次 运行。
如果用户输入 "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 和经典回调代码。如果你想确保调用者等到函数 完全 完成,那么你可以将完整的函数转换为一个 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)?");
}
});
}
});
}