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
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这是我个人的建议:)