'function foo(callback)'和'foo(arg1,arg2,function(err,data))'之间有什么区别?

我是nodejs的初学者。 我已经从nodeschool.io下载了learnyounode模块,并且正在尝试使用Make it modular练习。 在练习结束时,他们提到了这一点:

另外请记住,检查错误并在callback函数中执行早期返回是惯用的:

 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函数,他们的forms是:

 foo(arg1, arg2, function(err,data){ if(err) //Handle it //Do something with data }); 

我很难理解两者之间的区别。 我google-d的,但说实话,有一些网页解释第一个callback风格,而有一些网页解释第二个。 我知道在第二种风格中, function(err, data)是asynchronous调用的。 我对“asynchronous”的理解是用arg1和arg2调用foo 。 当“foo”完成function(err,data)被调用。

但是我没有得到function bar (callback)符号。 他们两个都在做callback,他们之间有什么区别? 我应该使用哪种符号来解决我的问题? 你如何决定使用哪一个?

foo(arg1, arg2, function(err,data){你正在调用foo并把它作为一个parameter passing给一个callback函数,在function foo(callback)定义了 foo并且说它的参数是一个函数,将被称为“callback”。

在非asynchronous设置中,你会写类似的东西

 //define foo function foo(arg1, arg2){ var someData = //... return someData; } //use foo var data = foo(1, 2); console.log(data); 

在asynchronous设置中,函数调用callback而不是返回值

 //define foo function fooAsync(arg1, arg2, callback){ var someData = //... callback(someData); } 

而不是将返回值分配给一个variables,我们传递一个callback,其中该variables是一个参数:

 //use foo fooAsync(1, 2, function(data){ console.log(data); }); 

我们也可以传递命名的函数作为callback。 传递匿名函数只是常见的情况:

 function processData(data){ console.log(data); } fooAsync(1, 2, processData);