Javascript“err”函数参数 - 它是如何工作的?

时间:2016-08-14 23:32:25

标签: javascript node.js

我正在查看使用“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”的值是如何传递给这个嵌套函数的?
    2. 我确实想知道答案是否在外部模块中,但我不知道......

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

3 个答案:

答案 0 :(得分:5)

这称为错误第一次回调,它不是一种语言功能,而是一种惯例。

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

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

  2.   
  3. 回调的第二个参数是为任何成功的响应数据保留的。如果没有发生错误,则将err设置为null和any   成功的数据将在第二个参数中返回。

  4.   

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

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

答案 1 :(得分:2)

调用printResultFor,并返回内部定义的函数。无论什么称为printResultFor,然后调用它现在可以访问的内部函数,因为它已被返回。它恰好发生在您不寻找它的代码中。

例如:

var printResult = printResultFor(something);

printResult(null, dataObjectHere);

通过执行此操作,printResult可以通过闭包访问op变量(因为它是在printResultFor函数中定义的,它可以访问在中定义的所有变量和参数它)。

答案 2 :(得分:1)

  1. 它不一定需要 ,因为有许多方法可以让许多猫受到伤害,但它使用的是一种称为“currying”的函数式编程模式。以下是与{javascript
  2. 相关的主题good introductory article
  3. 节点中的常见模式是将err作为回调中的第一个参数。如果没有错误,则通常为值nullres是未遇到错误时获得的数据。