обратные вызовы должны использоваться условно? - PullRequest
1 голос
/ 07 августа 2011

У меня проблемы с пониманием обратных вызовов в javascript. Я искал переполнение стека, но не смог решить один из моих вопросов:

Обратные вызовы предназначены для обработки асинхронных событий, таких как запрос сервера. У моей книги есть этот пример:

request = prepare_request();
send_request(request,function(response) {
    display(response);
    });
  1. как это обратный вызов?
  2. параметр ответа не был определен, так как его можно вызвать send_request()?
  3. если обратные вызовы должны вызываться асинхронно, они должны быть условными, верно? поэтому они всегда должны появляться с оператором if?

Любая помощь будет отличной.

Ответы [ 5 ]

2 голосов
/ 07 августа 2011

Обратные вызовы - это просто функции. Они не должны быть асинхронными, хотя обычно это так.

Когда функция определена, она может перечислить параметры, которые она ожидает получить . Аргумент 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 голос
/ 07 августа 2011

Давайте расширим этот пример:

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);
1 голос
/ 07 августа 2011
  1. Это обратный вызов, но вы создаете метод обратного вызова, когда вызывается метод send_request.Этот метод будет вызван, когда сервер вернется.Если вы используете что-то вроде Firebug, вы увидите, что при пошаговом выполнении кода функция внутри send_request будет выделена, но не будет вызываться до тех пор, пока сервер не вернется.

  2. Это параметр для функции, означающий, что при вызове обратного вызова что-то передаст эту переменную в метод.

По сути, вы делаете это, за исключением того, что вы перенесли определение функции обратного вызова втот же метод, который требует этого:

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

request = prepare_request();
send_request(request, MyCallback);
  1. Я не уверен, что следую за вами.Как правило, у вас будет успешный и неудачный обратный вызов.Успех всегда должен вызываться, если метод (обычно AJAX) возвращается успешно.Отказ происходит точно так же, но, очевидно, когда что-то выходит из строя.

Если у вас есть один метод обратного вызова, то имеет смысл попробовать и проверить, провалился ли он или нет.

Я надеюсь, что это имеет смысл!

0 голосов
/ 07 августа 2011

Обратный вызов - это способ определить, что должно произойти в какой-то неопределенный более поздний момент времени. В вашем примере AJAX скрипт выполнит вызов сервера. Этот запрос может занять некоторое время. Это может не завершиться вообще. Но если и когда запрос завершится, вы захотите выполнить некоторый код, который что-то делает с ответом. И, если возможно, вы не хотите заставлять вашу программу ждать до тех пор, но выполните AJAX-запрос асинхронно .

Итак, функция, которая выполняет запрос AJAX, позволяет вам указать функцию обратного вызова. Это просто означает, что «если и когда запрос завершится успешно, я вызову эту функцию (назад)». В вашем случае эта функция определена как встроенная. Вы также можете просто передать имя любой другой функции, которая определена как обычная именованная функция, что может облегчить ее понимание. Вы просто говорите: «После выполнения запроса, пожалуйста, выполните эту функцию».

В качестве первого параметра этой функции передается результат запроса AJAX. Вот почему ваша функция обратного вызова определяет параметр ответа.

Надеюсь, это поможет.

0 голосов
/ 07 августа 2011

Callback - это фрагмент кода, который должен выполняться, когда что-то сделано.Думайте о них как об уведомлениях или уведомлениях о событиях (c #, язык Java).

Часто они используются при проверке ответов Ajax, но в них нет ничего асинхронного.

Простой пример - Obvserver /Абонентский паттерн.Я дам вам знать, чтобы уведомить меня, когда что-то будет сделано на вашей стороне.Это достигается за счет того, что я посылаю вам дескриптор функции (может быть встроенным или может быть дескриптором существующей функции).

Примеры:

Жаль, что я был достаточно быстр, чтобывведите @ Пабло прекрасные примеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...