我有这个程序:
- 递归地查找存储库(请参见
recurse()
) - 在每个存储库中,查找我定期更新的特定点文件(请参见
update()
) - 提示用户确认每次更新(请参见
confirm()
)
function confirm(prompt,defaultOption = true) {
console.warn("At confirm");
return new Promise(function(resolve,reject) {
console.warn("Question asked");
readline.question(prompt,async function(answer) {
console.warn("Question answered");
if (/^y(es)?$/i.test(answer) || (answer === "" && defaultOption === true)) {
resolve(true);
} else if (/^n(o)?$/i.test(answer) || (answer === "" && defaultOption === false)) {
resolve(false);
} else {
resolve(await confirm(prompt,defaultOption));
}
});
});
}
async function update(directory = baseDirectory) {
console.warn("At update");
for (const file of [[".eslintrc.json"],["tsconfig.json"],[".vscode","extensions.json"],"settings.json"]]) {
if (fs.existsSync(path.join(directory,file[file.length - 1]))) {
console.warn("Before confirm");
console.log("==== " + directory + " ====");
if (argv["yes"] === true || (await confirm(directory + "\tOverwrite `" + file[file.length - 1] + "`? [Y/n] ")) === true) {
fs.copyfilesync(path.join(kerplowDirectory,...file),path.join(directory,...file));
}
console.warn("After confirm");
}
}
}
(function recurse(directory = baseDirectory) {
for (const file of fs.readdirSync(directory)) {
if (fs.statSync(path.join(directory,file)).isDirectory()) {
if (file === ".git") {
console.warn("Before update");
update(directory);
console.warn("After update");
}
if (file !== "node_modules") {
recurse(path.join(directory,file));
}
}
}
})();
问题是双重的:
-
readline
反复问第一个问题 - 它只会询问第一组问题,然后完全停止响应输入
示例输出:
At update
Before confirm
==== .bash_logout ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Before update
At update
Before confirm
==== .bashrc ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Before update
At update
Before confirm
==== .cache ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Before update
At update
Before confirm
==== .config ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Before update
At update
Before confirm
==== .npm ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Before update
At update
Before confirm
==== .profile ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Before update
At update
Before confirm
==== .upm ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Before update
At update
Before confirm
==== config.json ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Before update
At update
Before confirm
==== index.js ====
At confirm
Question asked
.bash_logout Overwrite `.eslintrc.json`? [YAfter update
Question answered
After confirm
Before confirm
==== .bash_logout ====
At confirm
Question asked
.bash_logout Overwrite `tsconfig.json`? [Y/n]
Question answered
After confirm
Before confirm
==== .bash_logout ====
At confirm
Question asked
.bash_logout Overwrite `extensions.json`? [Y/n]
Question answered
After confirm
Before confirm
==== .bash_logout ====
At confirm
Question asked
.bash_logout Overwrite `settings.json`? [Y/n]
Question answered
After confirm
<indefinite hang>
REPL: