我目前正在学习Node和JavaScript中的回调,我对此感到困惑:
var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})
我的问题是:请求函数如何知道回调中每个参数/参数是什么?因为我可以用两个参数有效地调用函数回调并跳过错误?该函数如何知道传递的第一个参数是响应而不是错误,例如?
是否在运行时检查每种类型?感谢。
答案 0 :(得分:4)
编写请求API的程序员决定发送给回调的参数的顺序。在运行时没有类型检查。如果您在回调签名中只提供两个参数,例如
function(response, body) {}
你仍然会收到错误对象和响应 - 只有在这种情况下,变量名为" response"将保存错误对象,以及名为" body"的变量会举行回应。你要跳过的输入将是你没有提供的第三个,即身体。参数的名称没有区别,它们在函数签名中的位置决定了它们的分配值。
按照惯例,在javascript回调中,回调的第一个参数通常表示错误对象。 总是以这种方式编写,但这是最佳实践。
答案 1 :(得分:3)
这个功能的Possibile实现可能是:
function request (url, callback) {
// doing something
callback (error, response, body);
}
该函数将设置error
,response
和body
参数的值。我不知道它是如何实现的,但假设您传递了url
的数字。可能的实施可能是:
function request (url, callback) {
if (typeof url === 'number') {
// Suppose that error is an instance of Error
callback (new Error ('Url must be a string'), null, null);
}
// other stuff...
}
答案 2 :(得分:1)
当你调用List <string> testList = new List <string> ();
testList.Add ("pens");
aList.Add (testList);
函数并提供函数作为参数时,它会在内部(模块内部)调用该函数并将其自己的数据作为参数传入(然后使用它)做各种事情)。它传入的数据是它自己生成的数据,它不是您正在创建的数据。
这是回调。
我前面回答的一个问题是,为什么这些模块的结构更加深入,请参阅:npm's guidelines on callback errors
答案 3 :(得分:0)
您正在使用特定模块我的朋友和回调在这种情况下直接从它控制。
“请求”模块的回调如何工作是研究的问题。检查他们的文档。