在javascript中使用回调后解释输出

时间:2015-10-06 09:43:07

标签: javascript node.js web callback functional-programming

我是javascript的新手,我正在努力了解回调。我无法理解为什么20在10之前被打印。我的理解是回调函数,如 - func1(parameter,func2())func2()是回调函数,它在func1执行后执行传递给func1的“参数”。我的理解是否正确?

function timePass(length){

    console.log("finished after doing timePass for "+length +" seconds")
}

timePass(10,timePass(20));

输出如下:

  

完成timePass 20秒后完成

     

完成timePass 10秒后完成

3 个答案:

答案 0 :(得分:4)

你并没有真正创建一个回调函数,但实际上是在最后一行代码的其他所有内容之前调用timePass(20)。

要传递回调函数,您应该执行以下操作:

function timePass(length,callback){
    console.log("finished after doing timePass for "+length +" seconds")
    if(typeof(callback) == "function")
        callback(20);
}

timePass(10,timePass);

答案 1 :(得分:2)

基本上当解释器正在查看它时,它将调用timepass(20)来评估结果(这没什么,因为你没有返回返回的东西),然后它尝试传递给外部函数。

即。

doFunction( doSomethingElse() );

如果doSomethingElse返回1,则必须先评估该值,然后才能将该值传递给doFunction

从根本上说,你实际上没有通过回调,你已经调用了这个函数。也许你的意思是:

callback = function() { somecode; }
target = function(data, callback) { console.log('hi'); callback(); }

target(10, callback);

注意缺少(),即callback而非callback()

答案 2 :(得分:2)

这是因为您执行函数timePass然后 - 将结果添加为参数编号2.

解释发生了什么:

首先定义新功能“timePass”,在控制台上打印功能 其次,你执行timePass(10, /*But here you execute it again*/ timePass(20))

函数timePass(20)将首先执行,因为您添加了() () == execute。如果您只是传递函数的名称,它将作为函数传递。当您使用()时,它将被执行,然后结果将作为参数传递。

使用CALLBACK的示例

function timePass(length, callbackFunction){

    console.log("finished after doing timePass for "+length +" seconds");

    // check if the function caller is included callback parameter
    // and check if it is function - to prevent errors.
    if (callbackFunction && typeof callbackFunction == "function") {
        // Execute the callback (timePass)
        callbackFunction(20);
    }
}

// Here you say, Execute timePass with arg 10, and then call timePass
timePass(10, timePass);
// and now callbackFunction defined above will be == timePass

// You can do also
timePass(10, anotherFunction)
// So another function will be executed after console.log()

使用案例

我们在处理异步代码时会使用大多数回调。

例如:Jsfiddle

// Imagine we have function which will request the server for some data.
function getData(index) {
  // The request - response will took some time
  // 0.1s ? 15s ? We don't know how big is the data we downloading.
  var data;
  // Imagine this is an AJAX call, not timeout.
  setTimeout(function() {
    // after 30ms we recieved 'server data'
    data = 'server data';
  },30)

  return data;
}

var users = getData('users');

console.log(users); // undefined - because we returned "data" before the AJAX is completed.

/*
So we can change the function and adding an callback.
*/

function getAsyncData(index, callback) {
  var data;
  // Imagine this is an AJAX call, not timeout.
  setTimeout(function() {
    // after 30ms we recieved 'server data'
    data = 'server data';
    callback(data);
  },30)

}

getAsyncData('users', function(data) {
  console.log(data); // 'server data'
});

// OR

function processData(data) {
  console.log(data);
}

getAsyncData('users', processData); // processData also logs 'server data'