【问题标题】:How does Node.js know if the first parameter of a callback is an error handler?Node.js 如何知道回调的第一个参数是否是错误处理程序?
【发布时间】:2015-04-29 17:26:42
【问题描述】:

我对 Node.js 还是很陌生,我正试图围绕它的错误优先回调风格展开思考。

我很好奇函数如何知道第一个参数是否用于处理错误以及何时用于处理请求以及什么不是,因为这些变量名称是任意的。

下面是一些先有错误和没有错误的代码示例

fs.readFile('/foo.txt', function(err, data) {
  if (err) {
      console.log('Ahh! An Error!');
      return;
  }
  console.log(data);
});

http.createServer(function(req, res) { ... });

我相信 Express 框架通过计算参数的数量来做到这一点,将 err 作为可选的第一个参数,但在这些情况下,只有两个参数。

【问题讨论】:

  • 顺便说一句,你不能有第一个参数可选...

标签: javascript node.js express callback


【解决方案1】:

让回调的第一个参数是错误代码只是 node.js 在其运行时库中用于所有异步函数回调的约定,现在已成为 node.js 世界中所有异步回调的某种标准,甚至在附加模块中。

您只“知道”这是由于文档而使用的约定。没有运行时检查这是正在使用的约定。

仅供参考,Javascript 中的所有回调都是如此。您只能通过回调的文档知道哪些参数是什么。


请注意,Javascript 中的回调用于不同类型的事物。有些用途需要传达错误状态,有些则不需要。例如,http 请求处理程序是一个回调,但与回调通信没有错误。要么有一个传入的 http 请求并且调用了回调,要么没有并且没有调用它。没有错误状态可以与该类型的回调通信,因此没有错误参数传递给它。

但是,几乎所有表示异步操作完成的回调都可能以错误结束,因此必须将 err 参数传递给回调,以便回调知道发生了什么以及异步操作是否成功。

回调有两种截然不同的用途。只有需要传达可能的错误状态的回调才会包含您询问的 err 参数。

例如,事件处理程序回调(在某些事件发生时调用的回调 - 例如浏览器中的点击、传入的 http 请求、传入的 webSocket 数据包、计时器事件)通常没有与相关联的错误状态他们,所以他们不使用err 参数约定。

【讨论】:

  • 它怎么知道它是一个错误检查器呢?和 createServer 函数一样,为什么 req 参数是请求而不是错误检查器?
  • @ChangLiu - 这种类型的回调就像事件通知(传入 http 请求的通知)。在这种情况下没有错误可以通过。事件发生并调用回调,或者事件尚未发生且未调用回调。与可能以错误结束的异步操作的结果不同,回调的使用类型不同。
  • @ChangLiu - 我在回答中添加了更多关于使用 err 和不使用的回调类型的答案。
【解决方案2】:

这对我来说更容易一些。将编码对象的函数想象为在函数上附加了类似这样的最后一行。

if (callback && typeof(callback) === "function") {  
        callback(param1, param2);  
    }  

实际上它会比这更普遍。但是,一旦您知道那里存在,您就可以采用更通用的方法(使用参数数组等)。

当我在寻找同样的东西时,我在 cmets 中得到了它。 http://www.impressivewebs.com/callback-functions-javascript/

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2017-07-14
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多