Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否使此函数同步?_Javascript_Node.js_Asynchronous_Synchronous_Console Input - Fatal编程技术网

Javascript 是否使此函数同步?

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

我正在运行下面的代码以从nodejs中的终端获取输入(我选择这个方法是因为它不需要依赖项),并且我需要它同步工作。它位于一个函数内部,该函数被
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)
})