我的代码:
const readline = require('readline');
function scan(callback) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '> ',
});
rl.prompt();
rl.on('line', (line) => {
callback(line);
rl.close();
}).on('close', () => {
process.exit(0);
});
}
scan(data => {
console.log('data: ', data); // can console
});
我使用了回调,它可以控制你输入的数据,但是当我使用promise时它不会控制:
function scan() {
return new Promise((resolve, reject) => {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '> ',
});
rl.prompt();
rl.on('line', (line) => {
resolve(line);
rl.close();
}).on('close', () => {
process.exit(0);
});
});
}
scan().then(data => {
console.log('data: ', data); // can not console
});
这发生了什么?回调和承诺之间有什么不同?
答案 0 :(得分:0)
有关更详细的答案,请参阅HMR的回复。
显然你在解决诺言后立即调用rl.close()。看看你的on close事件处理程序:
process.exit(0);
显然,它会停止所有执行并终止你的程序。事件虽然您的承诺得到解决,但是会更快地调用exit(事件循环的正常行为)。
所以要解决你的问题:删除on close事件处理程序。在每个承诺得到解决后,您的程序将优雅地终止。
答案 1 :(得分:0)
堆栈和队列问题,你的回调与rl.close在同一个堆栈上但是解析处理程序不是(那个在队列中)。
例如:
new Promise(resolve=>resolve())
.then(_=>console.log("last"))//resolve handler is going on queue
console.log("first")//this is on the same stack so logs
//nothing more on the stack so get stuff from queue

简单的解决方案是在解析处理程序后将关闭放在que上:
function scan() {
return new Promise((resolve, reject) => {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '> ',
});
rl.prompt();
rl.on('line', (line) => {
resolve(line);
//put close on queue
Promise.resolve()
.then(
_=>rl.close()
);
}).on('close', () => {
process.exit(0);
});
});
}
scan().then(data => {
console.log('data: ', data); // can not console
});
堆叠和队列video或ducumentation