是否有条件地使用回调?

时间:2011-08-07 03:33:51

标签: javascript callback

我无法理解javascript中的回调。我搜索了堆栈溢出,但无法解决我的一个问题:

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

request = prepare_request();
send_request(request,function(response) {
    display(response);
    });
  1. 这是一个回调?
  2. 尚未定义响应参数,因此send_request()如何调用?
  3. 如果要异步调用回调,它们必须是有条件的吗?所以他们应该总是出现if声明?
  4. 任何帮助都会很棒。

5 个答案:

答案 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)

  1. 这是一个回调,但是你在调用send_request方法时创建了回调方法。服务器返回时将调用此方法。如果您使用类似Firebug的东西,您会看到,当单步执行代码时,send_request中的函数将突出显示,但在服务器返回之前不会调用它。

  2. 这是函数的一个参数,意味着当调用回调时,会将该变量传递给方法。

  3. 基本上,除了将回调函数的定义移动到需要它的相同方法之外,你正在这样做:

    MyCallback = function (response) {
         display(response);
    };
    
    request = prepare_request();
    send_request(request, MyCallback);
    
    1. 我不确定我是否跟着你。通常,您将获得成功和失败回调。如果方法(通常是AJAX)成功返回,则应始终调用Success。失败是一样的,但显然,当事情失败时。
    2. 如果您有一个回调方法,那么尝试检查它是否失败是有意义的。

      我希望这是有道理的!

答案 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请求的结果。这就是你的回调函数定义响应参数的原因。

希望有所帮助。