Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 Readline:逐行读取三个输入,如果为真,则循环_Javascript_Node.js - Fatal编程技术网

Javascript Readline:逐行读取三个输入,如果为真,则循环

Javascript Readline:逐行读取三个输入,如果为真,则循环,javascript,node.js,Javascript,Node.js,我正在形成一个具有以下结构的输入: var nodeArray = [ { position: null, value: null }, { position: null, value: null }, // ... ] 逐行读取用户输入。对于单个迭代,下面列表中的每一行都是rl.setPrompt(prompt)中的prompt参数 插入要插入此节点的位置> 插入此节点的值> 是否要插入另一个节点> 如果是,循环…在步骤1再次开始 如果N

我正在形成一个具有以下结构的输入:

var nodeArray = [
  {
    position: null,
    value: null
  },
  {
    position: null,
    value: null
  },
  // ...
]
逐行读取用户输入。对于单个迭代,下面列表中的每一行都是
rl.setPrompt(prompt)
中的
prompt
参数

  • 插入要插入此节点的位置>
  • 插入此节点的值>
  • 是否要插入另一个节点>
    • 如果
      ,循环…在步骤1再次开始
    • 如果
      No
      ,则解决
      promise
      并关闭
      rl
  • 通过对node.js的理解,我能够为如下简单结构编写代码:

    var array = [
      value1,
      value2,
      value3,
      //...
    ]
    
    用于用户输入以形成
    数组的代码:

    input.js

    'use strict';                                                         
    
    const readline = require('readline');                                 
    
    const rl = readline.createInterface({                                 
      input: process.stdin,
      output: process.stdout                                              
    });                                                                   
    
    module.exports = {
      init : async function(arr) {                                        
        this.arr = arr;
        const pr = await this.userInputOn();                              
        return pr;                                                        
      },                                                                  
    
      promptUpdater : function() {
        rl.setPrompt(`Insert ${this.arr.length}th array Element> `);      
        rl.prompt();                                                      
      },                                                                  
    
      userInputOn : function() {
        return new Promise((resolve, reject) =>  {                        
          this.promptUpdater();
          rl.on('line', (line) => {
            if(line === "close") resolve(this.arr);                       
            else {
              this.arr.push(+line);                                       
              this.promptUpdater();                                       
            }                                                             
          });                                                             
        });                                                               
      },                                                                  
    }
    
    使用input.js代码的代码:

    main.js

    'use strict';
    
    const stdIn = require('input');
    
    const input = stdIn.init([]);
    
    input.then(function fulfilled(response) {
      // do something with response
    });
    

    我无法扩展
    input.js
    代码以满足形成
    noderray
    结构的要求。此外,此代码还有一些小问题,例如,它永远不会关闭
    rl

    在编写异步代码时,您应该始终尝试将尽可能小的任务包装成承诺。在这种情况下,这将是:提示一个问题,等待答案。因为我们只想听一个答案,所以我们只需使用
    .once
    而不是
    。on

      function prompt(question) {
       return new Promise((resolve) => {
        rl.setPrompt(question);
        rl.prompt();
        rl.once("line", resolve);
       });
     }
    
    至此,创建节点非常简单:

      async function createNode() {
       return {
        position: await prompt("Position?"),
        value: await prompt("Value?"),
      };
     }
    
    循环也是直接的(如果我们使用async/await),不需要任何递归:

     async function createNodes() {
       const result = [];
       while(true) {
         result.push(await createNode());
         if(await prompt("Continue? Yes / No") === "No")
           break;
       }
       return result;
     }
    

    请参考一些阅读材料,从中我可以学到一些好的实践,比如——在编写异步代码时,您应该始终尝试将尽可能小的任务封装到Promise@haslo这是我个人的建议:)