什么是异步`completer`函数中的回调

时间:2018-08-23 18:04:24

标签: node.js

我正在阅读以下文档。   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?

1 个答案:

答案 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