在javascript中使用回调后解释输出
我是javascript新手,我正在努力理解回调。我不明白为什么20比10早打印出来。我对回调函数的理解是-在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
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'