Node.js - process.stdin.on 上的递归函数会产生不需要的重复行为



我仍然是Node.js的初学者。所以我必须发布整个函数以获得整体视图:

我有这个函数"loopDialog",它需要一个对象和一个起始索引。它启动一个对话框,

允许用户
  1. 提供项目依赖项所需库的名称(以逗号分隔输入并按 Enter 键(。
  2. 以传递到下一个依赖项(通过输入"n"并按回车键(。
  3. 退出(通过输入"e"并按回车键((这会将他传递给下一个函数(。

我的问题是,由于我希望流是异步的,我尝试通过使其成为递归函数来循环。但是,在对话框中按 (n((将用户传递到下一个依赖项(会显示消息"您知道系统库吗..."对于相同的依赖关系 n 次,其中 n 是我按下"n"的次数。

变量"flag"用于克服另一种不希望的行为,该行为使函数在用户输入任何内容时继续发送发布请求,即使在函数退出后也是如此。

由于某种原因,我无法使用 async/await 解决此问题。

有没有其他方法可以避免所有这些头痛(或至少解决"n"问题(?

var request = require('request');
var qs1 = require('qs');
var oss = process.platform;
process.stdin.resume();
process.stdin.setEncoding('utf8');
var flag = true;
var res = {'unrecognized': ['a', 'b', 'c', 'd', 'e', 'f', 'g'], 'dependencies': ['x', 'y', 'z']};
loopDialog (res, 0);
var loopDialog = function (res, i) {
console.log(`Do you know the system libraries needed for: '${res.unrecognized[i]}' ?nn`);
process.stdin.on('data', function(answer) {
if (!flag) return;
answer = answer.replace(/ /g, "").replace(/n/g, "").split(",");
if (answer.length === 0 || answer.length === 1 && answer[0].toLowerCase() === 'e'){
flag = false;
checkWhatToInstall(res.dependencies, 0);
} else {
if (answer.length === 1 && answer[0].toLowerCase() === 'n') {
if ( i < res.unrecognized.length -1) {
loopDialog (res, ++i);
}
else{
flag = false;
checkWhatToInstall(res.dependencies, 0);
}
} else if (i < res.length){
console.log(answer);
var x = {form: {packages: res.unrecognized[i], os: oss, pack_type: 'npm', dependencies: answer}};
request.post('http://localhost:3000/add', {
form: qs1.stringify({
package: res.unrecognized[i], os: oss, pack_type: 'npm', dependencies: answer
}, {
arrayFormat : 'brackets'
})}, 
function optionalCallback(err, httpResponse, body) {
if (err) {
console.log(err);
}
else {
res.dependencies.concat(answer);
if (i < res.unrecognized.length -1)
loopDialog (res, ++i);
else {
flag = false;
checkWhatToInstall (res.dependencies, 0);
}
}
});
}
}
});
}
var checkWhatToInstall (res, i) {
console.log('Do something');
}

我最终初始化了一个全局数组"temp",每当使用 res.unrecognition 的成员时,它都会被推到"temp",然后在函数的第一行中计算条件,以便

....
var temp = [];
var loopDialog = function (res, i) {
if (!flag || temp.includes(res.unrecognized[i])) return;
console.log(`Do you know the system libraries needed for: '${res.unrecognized[i]}' ?nn`);
temp.push(res.unrecognized[i]);
...
}
....

注意:我仍在寻找更好的方法。

最新更新