首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Readline:逐行读取三个输入,如果为true,则循环

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

Stack Overflow用户
提问于 2019-04-20 01:00:00
回答 1查看 115关注 0票数 0

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

var nodeArray = [
  {
    position: null,
    value: null
  },
  {
    position: null,
    value: null
  },
  // ...
]

用户输入是逐行读取的。下面列表中的每一行都是单次迭代的rl.setPrompt(prompt)中的prompt参数。

  1. 插入您要插入此node>
  2. 插入此node>
  3. 的值的位置是否要在步骤1中再次插入另一个node>
    • if Yes,loop...start H212H113if d14,解析d15并关闭rl.

根据我对node.js的理解,我能够为这样一个简单的结构编写代码:

var array = [
  value1,
  value2,
  value3,
  //...
]

用户输入表单array的代码:

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代码来满足我形成nodeArray结构的要求。此外,这段代码有一些小问题,比如,它永远不会关闭rl

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-20 01:12:21

在编写异步代码时,您应该始终尝试将尽可能小的任务包装到Promise中。在这种情况下,这将是:提示问题,等待答案。因为我们只想听一个答案,所以我们只使用.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;
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55765231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档