我正在查看使用“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);
};
};
}
我的问题是:
和
我确实想知道答案是否在外部模块中,但我不知道......
(最后注意:我是Javascript和Node的自学新手,我敢打赌这对大多数人来说都是微不足道的,但是感谢你提供任何解释和帮助。)
答案 0 :(得分:5)
这称为错误第一次回调,它不是一种语言功能,而是一种惯例。
正如Fred K. Schott在The Node.js Way - Understanding Error-First Callbacks中所说:
回调的第一个参数是为错误对象保留的。如果发生错误,它将由第一个错误参数返回。
- 醇>
回调的第二个参数是为任何成功的响应数据保留的。如果没有发生错误,则将err设置为null和any 成功的数据将在第二个参数中返回。
基本上它说的是,如果通过检查第一个参数你会知道任何错误。
这是任何基于回调的nodejs库的预期行为,你应该设计你的接口。
答案 1 :(得分:2)
调用printResultFor
,并返回内部定义的函数。无论什么称为printResultFor
,然后调用它现在可以访问的内部函数,因为它已被返回。它恰好发生在您不寻找它的代码中。
例如:
var printResult = printResultFor(something);
printResult(null, dataObjectHere);
通过执行此操作,printResult
可以通过闭包访问op
变量(因为它是在printResultFor
函数中定义的,它可以访问在中定义的所有变量和参数它)。
答案 2 :(得分:1)
err
作为回调中的第一个参数。如果没有错误,则通常为值null
。 res
是未遇到错误时获得的数据。