【发布时间】:2025-11-26 20:45:02
【问题描述】:
我的代码:
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
});
这是怎么回事?callback和promise有什么不同?
【问题讨论】:
-
@cometguy 我读过,但我认为这不是我的问题的答案。
-
可以多次调用回调(例如在示例中的每一行)。一个承诺只能解决(履行或拒绝)一次。它可能适合在整个文件完成时发出信号,但您不能使用它来处理行。
-
如果你问我,这段代码只是结构错误。您正在函数内执行
process.exit(),但期望其结果在退出实际发生之前由调用者处理。这只是一个糟糕的编码设计,由于异步处理顺序的细微差别,它在这里咬了你。修复设计,使操作的顺序由代码直接指定和控制,而不是留给如何安排不同类型的异步操作的细微差别。此外,在大多数情况下,您可以让程序在无事可做时自行退出。
标签: javascript node.js callback promise