我是nodejs的初学者。我已经从nodeschool.io下载了learnyounode
模块,我正在尝试从中进行Make it modular
练习。在练习结束时,他们提到了这一点:
另请注意,检查错误是不恰当的 回调函数中的早期返回:
function bar (callback) { foo(function (err, data) { if (err) return callback(err) // early return // ... no error, continue doing cool things with `data` // all went well, call callback with `null` for the error argument callback(null, data) }) }
每当我尝试理解callback
函数时,它们都是以下形式:
foo(arg1, arg2, function(err,data){
if(err)
//Handle it
//Do something with data
});
我很难理解两者之间的区别。我google-d,但老实说,有一些页面解释了第一个回调样式,而有些页面解释了第二个回调样式。我知道在第二种风格中,function(err, data)
是异步调用的。我的理解是"异步"是使用arg1和arg2调用foo
。什么时候" foo"已完成function(err,data)
被调用。
但是我没有得到function bar (callback)
符号。他们俩都在回调那么他们之间的区别是什么?我应该使用哪种符号来解决我的问题练习?你如何决定使用哪一个以及何时使用?
答案 0 :(得分:3)
在foo(arg1, arg2, function(err,data){
中您正在调用foo
并将回调函数作为参数之一传递给它。在function foo(callback)
中,您定义 foo,并说它的参数是一个函数,您将其称为"回调"。
在非异步设置中,您可以编写类似
的内容//define foo
function foo(arg1, arg2){
var someData = //...
return someData;
}
//use foo
var data = foo(1, 2);
console.log(data);
在异步设置中,函数调用回调而不是返回值
//define foo
function fooAsync(arg1, arg2, callback){
var someData = //...
callback(someData);
}
而不是将返回值赋给变量,我们传递一个回调,其中该变量是一个参数:
//use foo
fooAsync(1, 2, function(data){
console.log(data);
});
我们还可以将命名函数作为回调传递。传递匿名函数只是常见的情况:
function processData(data){
console.log(data);
}
fooAsync(1, 2, processData);