我正在阅读以下文档。 https://nodejs.org/dist/latest-v10.x/docs/api/readline.html#readline_use_of_the_completer_function
要提到的是,如果completer函数接受两个参数,则可以异步调用它:
function completer(linePartial, callback) {
callback(null, [['123'], linePartial]);
}
我没有得到什么是“回调”(我知道一旦函数完成执行,就会调用回调,但是在这种情况下,正是在其中定义了“回调”函数)? 它是接受两个参数的单独函数吗?
我是否需要显式定义名为“回调”的函数?
为什么callback的第一个参数为null?
答案 0 :(得分:1)
您不需要编写此回调函数,只需将它作为完成函数的参数提供给您。 Node在内部某个位置创建函数。
Node编写回调的方式期望在第一个位置给出错误,在第二个位置给出结果。这种(err,value)样式在Node中很常见,其他库也经常会使用它。
以下是异步使用完成器的示例(我使用setTimeout在按下Tab键和显示结果之间添加300ms的延迟)
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
completer: (line, callback) => {
const completions = '.help .error .exit .quit .q'.split(' ');
const hits = completions.filter((c) => c.startsWith(line));
setTimeout(
() => callback(null, [hits.length ? hits : completions, line]),
300,
);
},
});
rl.question('Press tab to autocomplete\n', (answer) => {
console.log(`you entered: ${answer}! Well done.`);
rl.close();
});
如果要在定义此完成器回调的Node中查看实际代码,请访问以下网址:https://github.com/nodejs/node/blob/master/lib/readline.js#L466
代码中检查您是否期望回调的位置在这里: https://github.com/nodejs/node/blob/master/lib/readline.js#L136