readline 对象的 Javascript 范围

标签 javascript scope readline

困惑为什么此代码在第二个提示后挂起:

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

function curry () {
  let inputs = []
  function _curry() {
    if (inputs.length > 5) {
      for (var i = 0; i < inputs.length; i++) {
        console.log(inputs[i]);
      }
    } else {
      rl.question("Number?", function(answer) {
        inputs.push(answer)
        rl.close();
        _curry()
      });
    }
  }
  _curry()
}

curry()

===>

~/Desktop$ node curry.js

Number?1

Number?2

HANG

但是,这个:

var readline = require('readline');

function curry () {
  let inputs = []
  function _curry() {
    if (inputs.length > 5) {
      for (var i = 0; i < inputs.length; i++) {
        console.log(inputs[i]);
      }
    } else {
      var rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
      });
      rl.question("Number?", function(answer) {
        inputs.push(answer)
        rl.close();
        _curry()
      });
    }
  }
  _curry()
}

curry()

工作正常:

数字?1 2号 数量?3 数量?4 数量?5 数量?6 1 2 3 4 5 6

这似乎是一个范围界定问题?阅读线没有关闭?吊装?

最佳答案

不,这与范围或声明提升无关。只是您太早关闭了 readline 实例(但它似乎是异步的,因此仍然显示第二个提示)。你应该使用

function curry () {
  // better don't use a global, especially if you don't leave it open
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
  let inputs = []
  function _curry() {
    if (inputs.length > 5) {
      rl.close(); // close it only once you're done with *everything*
      for (var i = 0; i < inputs.length; i++) {
        console.log(inputs[i]);
      }
    } else {
      rl.question("Number?", function(answer) {
        inputs.push(answer)
        _curry()
      });
    }
  }
  _curry()
}

关于readline 对象的 Javascript 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48217613/

相关文章:

scope - 符号表如何与静态链和作用域相关?

haskell - 在 Haskell 中找不到模块 'System.Console.Readline'

python - 将数字数据(保存在文本文件中)读取到Python中的正确方法是什么?

javascript - Safari 在卸载页面之前更改 dom

javascript - Protractor 仅运行 Chrome

javascript - 如何检测 Javascript/JQuery 对象是否有高度?

javascript - 如何验证在特定条件下必须存在的字符

javascript - javascript中的作用域表现得很奇怪

javascript - 如何将范围保持在 XHR 请求内?

Python 序列号 : How to use the read or readline function to read more than 1 character at a time