Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中使用回调后解释输出_Javascript_Node.js_Web_Callback_Functional Programming - Fatal编程技术网

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

在javascript中使用回调后解释输出,javascript,node.js,web,callback,functional-programming,Javascript,Node.js,Web,Callback,Functional Programming,我是javascript新手,我正在努力理解回调。我不明白为什么20比10早打印出来。我对回调函数的理解是-func1(parameter,func2()),func2()是回调函数,它在执行func1之后执行,并将“parameter”传递给func1。我的理解正确吗 function timePass(length){ console.log("finished after doing timePass for "+length +" seconds") } timePass(1

我是javascript新手,我正在努力理解回调。我不明白为什么20比10早打印出来。我对回调函数的理解是-
func1(parameter,func2())
func2()
是回调函数,它在执行
func1
之后执行,并将“parameter”传递给
func1
。我的理解正确吗

function timePass(length){

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

timePass(10,timePass(20));
输出如下:

完成时间传递20秒后完成

完成时间传递10秒后完成


基本上,当解释器看到这个问题时,它会调用
timepass(20)
来计算结果(因为没有返回值,所以结果为nothing),然后它会尝试将结果传递到外部函数中

i、 e

如果
doSomethingElse
返回1,则必须先计算该值,然后才能将该1传递到
doFunction

基本上,您并没有实际传递回调,而是调用了该函数。也许你的意思是:

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

target(10, callback);

请注意缺少
()
,即
回调
不是
callback()

您实际上并不是在创建回调函数,而是在最后一行代码中调用timePass(20)

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

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

timePass(10,timePass);

这是因为执行函数
timePass
,然后-将结果添加为参数2

解释正在发生的事情:

首先定义新函数“timePass”,即在控制台上打印的函数。
第二次执行
timePass(10,/*但在这里再次执行它*/timePass(20))

将首先执行函数timePass(20),因为您添加了
()

()==执行
。如果只传递函数名,它将作为函数传递。当您使用
()
时,它将被执行,然后结果将作为参数传递

使用回调函数的示例 用例

在处理异步代码时,通常使用回调

例如:


在目标方法定义中必须有第二个参数吗?不,一点也不,可以有任意多个参数。如果您想要回调,那么您需要有一个参数来传递它。但是,这些函数还不是真正的异步的——如果你想做一些像UI动画等的事情,那就是你想使用回调来确保一切正常工作的时候。在没有更多上下文的情况下,很难给出建议。另外,要小心将相同的函数作为回调传递给它本身-你可能会得到一个递归的东西,这很酷,但通常是糟糕的编程(它很复杂,并且与堆栈溢出有关)-而递归是一个方便的概念,你可以用一个好的循环做同样的事情。如果在这个页面上考虑EC2.Access VPCPPERIN连接方法,它将接受参数。所以必须有一个回调();在方法体中,以便在AcceptVpcPeringConnection将控制权传递回调用方之前执行我要传递的函数()?我有点不确定您的确切示例。请注意,在他们的示例中,他们使用的是函数定义,而不是函数指针-因此,表示目标(10,回调)和目标(10,foo(x,y){…})之间存在差异;后者不会将其作为函数定义(即foo(){}有效地返回函数引用本身)调用。我喜欢使用
回调和&callback()
来防止大规模递归该行做什么?callback&&callback()左侧何时计算为false?@Zack是的,我正在编写一个不同的示例,因此它实际上不需要。您可以检查回调是否存在,如我更新的代码中所示。好的。在什么情况下我们使用“callback&&callback()”?所以它只是将语句块或函数传递给另一个函数的一种方式。我可以使用传递的这个函数在体内做相应的事情。这里我看到的唯一优点是,我可以根据需要将不同的函数传递到回调函数中。我说的对吗?回调最常用于异步代码。当您从DB服务器读取某些文件或下载数据时,它会持续一段时间。所以在继续之前你必须“等待”它,对吗?因此,在异步代码完成后,可以使用回调函数进行一些工作。如果您愿意,我将在编辑中解释“用例”。您给出的上述示例看起来并不异步,因为回调仅在父方法末尾执行。你能给出一个异步回调的例子吗?谢谢,我刚刚读了这篇-。看来回调是确保相互依赖的异步函数正常工作的一种方法。回调是一种确保在调用函数之前,其父函数或它所依赖的函数已完成的方法。
function timePass(length,callback){
    console.log("finished after doing timePass for "+length +" seconds")
    if(typeof(callback) == "function")
        callback(20);
}

timePass(10,timePass);
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()
// 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'