2011-08-07 18 views
1

我无法理解JavaScript中的回调。我已经通过堆栈溢出进行了搜索,但一直未能清除我的问题之一:是有条件使用的回调?

回调是为了处理异步事件,如服务器的请求。一本书中,我有这个例子:

request = prepare_request(); 
send_request(request,function(response) { 
    display(response); 
    }); 
  1. 如何,这是一个回调?
  2. 响应参数尚未定义,那么如何调用send_request()
  3. 如果回调意图被异步调用,它们必须有条件的权利?所以他们应该总是出现在if声明?

任何帮助将是伟大的。

回答

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); }); 

它可能看起来可笑,但是这是一个回调函数的演示。回调函数只是您传递给其他函数的函数,而其他函数将会在未来的某个时间点通过函数回调

+0

我比你更喜欢你的解释:) – Kris

1
  1. 这是一个回调函数,但您在调用send_request方法时创建回调方法。该方法将在服务器返回时调用。如果你使用类似Firebug的东西,你将会看到,在遍历代码时,send_request中的函数将被突出显示,但直到服务器返回时它才会被调用。

  2. 这是调用回调时函数含义的参数,它会将该变量传递给方法。

基本上,你这样做,除非你移动的回调函数的定义放在同样的方法需要它:

MyCallback = function (response) { 
    display(response); 
}; 

request = prepare_request(); 
send_request(request, MyCallback); 
  1. 我不知道我跟着你。通常你会有成功和失败的回调。如果方法(通常是AJAX)成功返回,应始终调用成功。失败是相同的方式,但显然,当某些事情失败时。

如果您有一个回调方法,那么尝试检查它是否失败是有意义的。

我希望有道理!

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); 
0

回调是一段代码,需要什么时间完成执行。把它们想象成通知或事件通知(c#,java说法)。

很多时候它们用于检查Ajax响应,但它们之间没有任何异步。

一个简单的例子是Obvserver/Subscriber模式。我让你知道在你身边做了什么事情的时候通知我。这是通过给我发送函数句柄(可以是内联函数或可以是现有函数的句柄)来实现的。

例子:

希望我足够快,在@ Pablo的很好的例子输入。

0

回调是一种定义在某个未定义的稍后时间点应该发生什么的方法。在您的AJAX示例中,该脚本将调用服务器。此请求可能需要一些时间才能完成。它可能根本无法完成。但是如果并且当请求完成时,你想执行一些代码来处理响应。如果可能的话,你不想让你的程序等到那个时候,但是异步执行AJAX请求

因此,执行AJAX请求的函数允许您指定回调函数。这仅仅意味着“如果请求成功,我将调用此函数(返回)”。在你的情况下,该函数是内联定义的。您也可以传递任何其他定义为普通命名函数的函数的名称,这可能会使其更容易理解。你只是说“请求完成后,请执行此功能。”

作为此函数的第一个参数,传递了AJAX请求的结果。这就是为什么你的回调函数定义了一个响应参数。

希望有所帮助。