&f功能foo(回调)'之间的区别是什么?和&#f;(arg1,arg2,函数(错误,数据))'?

时间:2014-09-13 16:12:16

标签: javascript node.js callback

我是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)符号。他们俩都在回调那么他们之间的区别是什么?我应该使用哪种符号来解决我的问题练习?你如何决定使用哪一个以及何时使用?

1 个答案:

答案 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);