Javascript 是否使此函数同步?
我正在运行下面的代码以从nodejs中的终端获取输入(我选择这个方法是因为它不需要依赖项),并且我需要它同步工作。它位于一个函数内部,该函数被Javascript 是否使此函数同步?,javascript,node.js,asynchronous,synchronous,console-input,Javascript,Node.js,Asynchronous,Synchronous,Console Input,我正在运行下面的代码以从nodejs中的终端获取输入(我选择这个方法是因为它不需要依赖项),并且我需要它同步工作。它位于一个函数内部,该函数被for循环反复调用,因此在当前异步状态下,它会导致一些问题 下面是我想同步的函数: standard_input.on('data', function (data) { choice = data; if (choice == 1) response = rp.r1; if (choice == 2) response = rp.r2; cons
for
循环反复调用,因此在当前异步状态下,它会导致一些问题
下面是我想同步的函数:
standard_input.on('data', function (data) {
choice = data;
if (choice == 1) response = rp.r1;
if (choice == 2) response = rp.r2;
console.log("[" + character.name + "]: " + response);
});
谢谢你的帮助
编辑:我的情况和代码的详细解释如下:
我有一个调用同步函数的for
循环,conversation()
。在该函数中,有一段代码要求for
循环暂停,直到用户输入了某个内容。我想用我现有的获取用户输入的方法(如上所示)或其他方法来实现这一点
编辑2:续集:
更完整的代码片段有助于回答问题,因为提供的一些答案对我不起作用,因为我不太清楚我要做什么
function conversation(character, num, rp) {
if (negStreak >= 4) {
return false;
}
var choice;
var response;
console.log("CHOICES:");
console.log("(1): " + rp.c1);
console.log("(2): " + rp.c2);
console.log("Type 1 or 2 and hit Enter.");
standard_input.on('data', function (data) { //this is how i'm getting input
choice = data;
if (choice == 1) response = rp.r1;
if (choice == 2) response = rp.r2;
negStreak++
console.log("[" + character.name + "]: " + response);
});
}
function game(char) {
negStreak = 0;
if (char.name == "Vern") array = vern_conv;
if (char.name == "Jericho") array = jericho_conv;
if (char.name == "Las") array = las_conv;
if (char.name == "char3") array = char3_conv;
if (char.name == "char4") array = char4_conv;
for (i = 0; i < array.length; i++) { //this is the for loop i'm talking about
var reactionPair = array[i];
conversation(char, i, reactionPair);
}
}
函数对话(字符、数字、rp){
如果(负条纹>=4){
返回false;
}
var选择;
var反应;
日志(“选项:”);
控制台日志(“(1):”+rp.c1);
控制台日志(“(2):”+rp.c2);
log(“键入1或2并按Enter键”);
标准_input.on('data',function(data){//这就是我获取输入的方式
选择=数据;
如果(选项==1)响应=rp.r1;
如果(选择==2)响应=rp.r2;
负条纹++
console.log(“[”+character.name+”]:“+响应);
});
}
功能游戏(char){
负条纹=0;
如果(char.name==“Vern”)数组=Vern\u conv;
if(char.name==“Jericho”)数组=Jericho_conv;
如果(char.name==“Las”)数组=Las_conv;
如果(char.name==“char3”)数组=char3\u conv;
如果(char.name==“char4”)数组=char4\u conv;
for(i=0;i
如果正确理解所需内容,则需要使用async并等待在函数中分配数据,因此您可能希望尝试类似的方法
async function userinput(){
return await new Promise(resolve=>{
standard_input.on('data', function passdata (data) {
standard_input.removeEventListener("data",passdata);
choice = data;
if (choice == 1) resolve(response = rp.r1);
if (choice == 2) resolve(response = rp.r2)
console.log("[" + character.name + "]: " + response);
});
})
}
userinput()
而不是将输入包装在for循环中
for (loop var) {
input = prompt_for_input <--- oh no, this is inherently async
do something with input
}
for(循环变量){
input=prompt\u for\u input在Javascript中不能使事件驱动的东西是同步的。根据其定义,它是事件驱动的,而不是同步的。如果您展示了您试图解决的更大的问题以及与之相关的代码,我们可以向您展示解决该问题的方法。仅供参考,如上所述,这是您询问某个特定问题的地方解决方案,而不是向我们展示原始问题是什么。在您的具体案例中,您还询问了错误的解决方案方向。您是否可以澄清为什么在触发函数时函数必须是同步的(Dom事件是异步的)?你能不能只获取函数内部的代码,然后移动到一个常规函数,并从该事件处理程序同步或异步调用该函数?关于在for循环中停止,你可以尝试使用生成器functions@George需要详细说明吗?请显示for
循环的实际代码,以便我们了解您真正想要的是什么确实如此。每次通过for
循环时添加新事件处理程序的整个概念都是错误的,因为它们只会堆积大量重复的事件处理程序。这与标准输入的('data',…)非常不符
返回一个承诺,因此对其使用wait
不会有任何作用。@jfriend00我知道这听起来可能有点牵强,但如果在承诺中使用标准输入.on
,然后返回承诺,该承诺会起作用吗?不,也不会起作用。必须向事件处理程序发出承诺(手动将其包装在承诺中,并且必须在触发事件后删除事件处理程序)。事件与这样的承诺不匹配,因为承诺是一次性设备,而这样的事件是多发设备。感谢您的回复,我刚刚更新了我的代码,这样的代码是否适用于事件?您的意思是什么?我正在尝试了解将事件与承诺一起使用的可能性,并感谢您的支持你的时间
prompt_for_input
whenWeGetInput(
do something with input
prompt_for_input // <-- this is your loop now
)
const readline = require('readline')
let rl = readline.createInterface(process.stdin, process.stdout)
rl.setPrompt('$ ')
rl.prompt()
rl.on('line', choice => {
switch(choice.trim()) {
case '1':
console.log('you typed 1')
break
case '2':
// and so on
default:
console.log(`you typed something else: ${choice}`)
break
}
rl.prompt() // <-- this is your loop now
}).on('close', () => {
process.exit(0)
})