我无法理解javascript中的回调。我搜索了堆栈溢出,但无法解决我的一个问题:
回调旨在处理异步事件,例如服务器的请求。我有一本书有这个例子:
request = prepare_request();
send_request(request,function(response) {
display(response);
});
send_request()
如何调用?if
声明?任何帮助都会很棒。
答案 0 :(得分:2)
回调只是功能。它们不必是异步的,尽管它们通常是。
定义函数时,它可以列出期望接收的参数。 response
参数就是一个例子。它表示当调用回调函数时,第一个参数将被赋值给变量response
。
回调与条件语句正交。虽然接收器可以有条件地调用回调,但它们不一定必须是有条件的。
这是一个蹩脚的回调示例,它是同步的,显然没有任何条件限制,
function greetPerson(name, greeter) {
greeter(name);
}
greetPerson("John", function(person) { alert("Hello " + person); });
greetPerson("Nancy", function(person) { console.log("Whats up " + person); });
这可能看起来很荒谬,但这是回调函数的演示。回调只是一个传递给其他函数的函数,而其他函数将来 回调 这个传递函数。
答案 1 :(得分:1)
这是一个回调,但是你在调用send_request方法时创建了回调方法。服务器返回时将调用此方法。如果您使用类似Firebug的东西,您会看到,当单步执行代码时,send_request中的函数将突出显示,但在服务器返回之前不会调用它。
这是函数的一个参数,意味着当调用回调时,会将该变量传递给方法。
基本上,除了将回调函数的定义移动到需要它的相同方法之外,你正在这样做:
MyCallback = function (response) {
display(response);
};
request = prepare_request();
send_request(request, MyCallback);
如果您有一个回调方法,那么尝试检查它是否失败是有意义的。
我希望这是有道理的!
答案 2 :(得分:1)
让我们展开这个例子:
request = prepare_request();
send_request(request,function(response) {
display(response);
});
function send_request(request, callback) {
// do stuff here to obtain a response
callback(response); //execute the callback passing the response
}
正如您所看到的,不需要有条件的。此外,当您定义回调时尚未创建响应,但回调确实知道一旦可用后该做什么,就像说“嘿foo
到达时,执行此操作”。
最后,对于您的第一个问题,我认为您将回调视为匿名函数时遇到问题。这不一定是这样,也可以这样做:
var callback = function(response) {
display(response);
}
send_request(request, callback);
或
function callback(response){
display(response);
}
send_request(request, callback);
答案 3 :(得分:0)
回调是一段需要在完成某些事情时执行的代码。将它们视为通知或事件通知(c#,java用语)。
通常它们用于检查Ajax响应,但没有任何异步。
一个简单的例子是Obvserver / Subscriber模式。我告诉你,当你身边的事情发生时,我会通知我。这可以通过向我发送函数句柄来实现(可以是内联的,也可以是现有函数的句柄)。
<强>示例:强>
希望我能快速输入@ Pablo的优秀例子。
答案 4 :(得分:0)
回调是一种定义在某个未定义的某个时间点应该发生什么的方法。在您的AJAX示例中,脚本将调用服务器。此请求可能需要一些时间才能完成。它可能根本无法完成。但是,如果请求完成,您希望执行一些代码来执行响应。如果可能,您不希望让程序等到那时,但是异步执行AJAX请求 。
因此,执行AJAX请求的函数允许您指定回调函数。这只是意味着“如果请求成功,我将调用此函数(返回)”。在您的情况下,该函数是内联定义的。您也可以只传递任何其他定义为正常命名函数的函数的名称,这可能使这更容易理解。您只是说“请求完成后,请执行此功能。”
作为此函数的第一个参数,传递AJAX请求的结果。这就是你的回调函数定义响应参数的原因。
希望有所帮助。