我正在形成一个具有以下结构的输入:
var nodeArray = [
{
position: null,
value: null
},
{
position: null,
value: null
},
// ...
]
用户输入是逐行读取的。下面列表中的每一行都是单次迭代的rl.setPrompt(prompt)
中的prompt
参数。
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
。
发布于 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;
}
https://stackoverflow.com/questions/55765231
复制相似问题