【问题标题】:Javascript "err" function parameter - how does it work?Javascript“err”函数参数 - 它是如何工作的?
【发布时间】:2016-08-15 07:37:33
【问题描述】:

我正在查看一个使用“if (err) {//code//);”的 Node.js 代码示例语句来控制其函数的输出 - 但是当调用函数时,我看不到任何传递给它们的东西,就好像“err”参数是由幕后的不可见代码定义的......

下面的代码是异步的,并使用 SDK 中的外部模块,请注意。

    /* "client.sendEvent" sends the data contained within the variable "message"
 to its destination, when this is complete the callback function "printResultFor"
 is called and a string is passed to that */

    client.sendEvent(message, printResultFor('Message'));

    //printResultFor looks like this:

    var printResultFor = function (op) {
      return function printResult(err, res) {
        if (err) console.log(op + ' error: ' + err.toString());
            if (res) {
                console.log(op + ' status: ' + res.constructor.name);
            };

      };
    }

我的问题是:

  1. 为什么这个回调函数需要返回一个嵌套函数?

  1. “err”和“res”的值是如何传递给这个嵌套函数的?

我确实想知道答案是否在外部模块中,但我不知道...

(最后注:我是 Javascript 和 Node 的自学新手,我敢打赌这对大多数人来说是微不足道的,但感谢您提供的任何解释和帮助。)

【问题讨论】:

  • Event 对象提供给addEventListener() 中的回调的方式相同。

标签: javascript node.js


【解决方案1】:

这称为错误第一回调,它不是语言功能而是约定。

正如 Fred K. Schott 在The Node.js Way - Understanding Error-First Callbacks 中所说:

  1. 回调的第一个参数是为错误对象保留的。如果发生错误,将由第一个 err 参数返回。

  2. 回调的第二个参数保留用于任何成功的响应数据。如果没有发生错误,err 将被设置为 null 并且任何 成功的数据将在第二个参数中返回。

基本上它的意思是如果有任何错误你会通过检查第一个参数来知道。

这是任何基于回调的 nodejs 库的预期行为,您应该设计类似的接口。

【讨论】:

  • 很好的链接,谢谢!我曾尝试研究错误处理——这解释了为什么我从未找到答案,因为从外观上看,这是更多的回调约定。再次感谢您的解释!
【解决方案2】:

printResultFor 被调用,它返回内部定义的函数。无论调用什么printResultFor,都会调用它现在可以访问的内部函数,因为它被返回了。它只是发生在您不寻找它的代码中。

例如:

var printResult = printResultFor(something);

printResult(null, dataObjectHere);

通过这样做,printResult 可以通过闭包访问op 变量(因为它是在printResultFor 函数中定义的,所以它可以访问其中定义的所有变量和参数。)

【讨论】:

  • 这真的很有帮助,我很高兴知道这里有一些看不见的元素在起作用,直到我现在去寻找它们之前都是看不见的......谢谢你让我走上正轨。
【解决方案3】:
  1. 不一定需要,因为有很多方法可以给许多猫剥皮,但它使用的是一种称为“currying”的函数式编程模式。这里是一个good introductory article 的主题,与 javascript 相关
  2. 在节点中使用err 作为回调中的第一个参数是一种常见的模式。当没有错误时,它通常是值nullres 是没有遇到错误时得到的数据。

【讨论】:

  • 我没有遇到过currying,谢谢你的链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多