Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему
Одной из важных областей использования является то, что вы регистрируете одну из своих функций как дескриптор (т. е. обратный вызов), а затем отправляете сообщение / вызываете некоторую функцию для выполнения некоторой работы или обработки. Теперь, после завершения обработки, вызываемая функция вызовет нашу зарегистрированную функцию (т. Е. Теперь выполняется обратный вызов), что указывает на то, что обработка выполнена. Эта ссылка wikipedia достаточно хорошо описана графически.
Функция обратного вызова - это функция, которую вы указываете для существующей функции / метода, которая должна быть вызвана, когда действие завершено, требует дополнительной обработки и т. д.
В Javascript или, более конкретно, jQuery, например , вы можете указать аргумент обратного вызова, который будет вызываться, когда анимация завершена.
В PHP функция preg_replace_callback()
позволяет вам предоставить функцию, которая будет вызываться при согласовании регулярного выражения, передавая строка (строки), сопоставленные как аргументы.
Давайте будем простыми. Что такое функция обратного вызова?
Пример по притче и аналогии
У меня есть секретарь. Каждый день я прошу ее: (i) отказаться от исходящей почты фирмы в почтовом отделении, а после она сделала это: (ii) любую задачу, которую я написал для нее на одном из этих липкие заметки .
Теперь, какова задача заметки? Задача меняется изо дня в день.
Предположим, что в этот конкретный день я требую, чтобы она распечатала некоторые документы. Поэтому я пишу это на липкой ноте, и я привожу ее на свой стол вместе с исходящей почтой, которую ей нужно отправить.
Итак:
Функция обратного вызова это вторая задача: распечатать эти документы. Потому что это сделано ПОСЛЕ того, как почта отпадает, а также потому, что клейкая записка, в которой ей сообщается распечатать документ, предоставляется ей вместе с письмом, которое ей нужно больше всего.
Давайте теперь свяжем это с программированием Словарь
Вот и все. Ничего больше. Надеюсь, это прояснилось для вас, а если нет, опубликуйте комментарий, и я сделаю все возможное, чтобы уточнить.
]Обратите внимание, что обратный вызов - это одно слово.
Очень важна страница обратного вызова википедии .
quote from wikipedia page:
В компьютерном программировании обратный вызов является ссылкой на исполняемый код или часть исполняемого кода, который передается в качестве аргумента другому коду. Это позволяет программному уровню более низкого уровня вызывать подпрограмму (или функцию), определенную на уровне более высокого уровня.
blockquote>
Обратные вызовы наиболее легко описаны в терминах телефонной системы. Вызов функции аналогичен вызову кого-то по телефону, задавая ей вопрос, получая ответ и подвешивая; добавление обратного вызова изменяет аналогию, поэтому, задав ей вопрос, вы также дадите ей свое имя и номер, чтобы она могла перезвонить вам с ответом.
- Пол Якубик, «Обратный звонок» Реализации в C ++ "
Функция обратного вызова Функция, переданная другой функции в качестве аргумента.
function test_function(){
alert("Hello world");
}
setTimeout(test_function, 2000);
Примечание: В приведенном выше примере test_function используется как аргумент для функции setTimeout.
Простой ответ на этот вопрос заключается в том, что функция обратного вызова является функцией, вызываемой с помощью указателя функции. Если вы передаете указатель (адрес) функции в качестве аргумента другому, когда этот указатель используется для вызова функции, на которую указывает он, говорят, что обратный вызов сделан
Это делает обратные вызовы похожими на операторы возврата в конце методов.
Я не уверен, что это то, что они есть.
Я думаю, что обратные вызовы - это фактически вызов функции , как следствие вызова и завершения другой функции.
Я также считаю, что обратные вызовы предназначены для устранения инициирующего вызова, в виде «эй, эта вещь, о которой вы просили? Я это сделал - просто подумал, что дам вам знать - обратно к вам ».
Call After будет лучшим именем, чем глупое имя, обратный вызов. Когда или когда условие встречается внутри функции, вызовите другую функцию, функцию Call After, полученную в качестве аргумента.
Вместо того, чтобы жестко программировать внутреннюю функцию внутри функции, вы записываете функцию, чтобы принять уже написанную функцию Call After в качестве аргумента. Call Call может быть вызван на основе изменений состояния, обнаруженных кодом в функции, получающей аргумент.
Ответ непрофессионала будет заключаться в том, что это функция, которая не вызывается вами, а скорее пользователем или браузером после того, как произошло определенное событие или после обработки какого-либо кода.
Предположим, что у нас есть функция sort(int *arraytobesorted,void (*algorithmchosen)(void))
, где он может принимать указатель на функцию в качестве своего аргумента, который может быть использован в некоторой точке реализации sort()
. Затем здесь код, который адресуется указателем функции algorithmchosen
, называется функцией обратного вызова.
И видим, что мы можем выбрать любой алгоритм, например:
1. algorithmchosen = bubblesort
2. algorithmchosen = heapsort
3. algorithmchosen = mergesort ...
, которые, скажем, были реализованы с помощью прототипа:
1. `void bubblesort(void)`
2. `void heapsort(void)`
3. `void mergesort(void)` ...
Это концепция, используемая для достижения полиморфизма в объектно-ориентированном программировании
Функция обратного вызова, также известная как функция более высокого порядка, представляет собой функцию, которая передается другой функции в качестве параметра, а функция обратного вызова вызывается (или выполняется) внутри родительской функции.
$("#button_1").click(function() {
alert("button 1 Clicked");
});
Здесь мы передаем функцию как параметр методу щелчка. И метод click вызовет (или выполнит) функцию обратного вызова, которую мы передали ей.
Что такое обратный вызов?
blockquote>
- Как правило, телефонный звонок, сделанный для возврата того, что кто-то получил.
- При вычислении callback является частью исполняемого кода, который передается в качестве аргумента другому коду. Когда функция выполняется с ее работой (или при возникновении какого-либо события), она вызывает функцию обратного вызова (она вызывает вас обратно - отсюда и название).
Что такое функция обратного вызова?
blockquote>
- Функция обратного вызова подобна Слуге, который «обращается» к своему Учителю, когда он выполнил задачу.
- Функция обратного вызова - это функция, которая передается другой функции (назовем эту другую функцию
otherFunction
) в качестве параметра, а функция обратного вызова (или выполняется) внутриotherFunction
. function action (x, y, callback) {return callback (x, y); } умножение функции (x, y) {return x * y; } сложение функции (x, y) {return x + y; } alert (действие (10, 10, умножение)); // output: 100 alert (действие (10, 10, дополнение)); // output: 20В SOA обратный вызов позволяет модулям плагина получать доступ к сервисам из контейнера / среды.
Аналогия: обратные вызовы. Асинхронный. Неблокирование Пример реальной жизни для обратного вызова
посмотрите на изображение:) [/g0]
Функция основной программы вызывает библиотеку (которая также может быть функцией уровня системы) с именем функции обратного вызова. Эта функция обратного вызова может быть реализована несколькими способами. Основная программа выбирает один обратный вызов по требованию.
Наконец, функция библиотеки вызывает функцию обратного вызова во время выполнения.
«В компьютерном программировании обратный вызов является ссылкой на исполняемый код или часть исполняемого кода, который передается в качестве аргумента другому коду. Это позволяет программному слою более низкого уровня вызывать подпрограмму (или функцию), определенную на уровне более высокого уровня ». - Wikipedia
Обратный вызов в C с использованием указателя функции
В C, обратный вызов реализуется с помощью Function Pointer. Функциональный указатель - как следует из названия, является указателем на функцию.
Например, int (* ptrFunc) ();
Здесь ptrFunc является указателем на функцию, которая не принимает аргументов и возвращает целое число. Не забудьте указать в скобках, иначе компилятор предположит, что ptrFunc - это нормальное имя функции, которое ничего не принимает и возвращает указатель на целое число.
Вот какой код для демонстрации функции.
#include<stdio.h>
int func(int, int);
int main(void)
{
int result1,result2;
/* declaring a pointer to a function which takes
two int arguments and returns an integer as result */
int (*ptrFunc)(int,int);
/* assigning ptrFunc to func's address */
ptrFunc=func;
/* calling func() through explicit dereference */
result1 = (*ptrFunc)(10,20);
/* calling func() through implicit dereference */
result2 = ptrFunc(10,20);
printf("result1 = %d result2 = %d\n",result1,result2);
return 0;
}
int func(int x, int y)
{
return x+y;
}
Теперь попробуем понять концепцию Callback в C, используя указатель функции.
Полная программа имеет три файла: callback.c, reg_callback.h и reg_callback. c.
/* callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* callback function definition goes here */
void my_callback(void)
{
printf("inside my_callback\n");
}
int main(void)
{
/* initialize function pointer to
my_callback */
callback ptr_my_callback=my_callback;
printf("This is a program demonstrating function callback\n");
/* register our callback function */
register_callback(ptr_my_callback);
printf("back inside main program\n");
return 0;
}
/* reg_callback.h */
typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);
/* reg_callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
printf("inside register_callback\n");
/* calling our callback function my_callback */
(*ptr_reg_callback)();
}
Если мы запустим эту программу, выход будет
. Это программа, демонстрирующая обратный вызов функции внутри register_callback внутри my_callback внутри основной программы
Функция более высокого уровня вызывает функцию нижнего уровня как обычный вызов, а механизм обратного вызова позволяет функции нижнего уровня вызывать функцию более высокого уровня с помощью указателя на функцию обратного вызова.
Обратный вызов в Java с использованием интерфейса
Java не имеет понятия указателя функции Он реализует механизм обратного вызова через свой интерфейсный механизм ism Здесь вместо указателя функции мы объявляем интерфейс, имеющий метод, который будет вызываться, когда вызывающий заканчивает свою задачу
. Позвольте мне продемонстрировать это через пример:
Интерфейс обратного вызова
public interface Callback
{
public void notify(Result result);
}
Caller или класс более высокого уровня
public Class Caller implements Callback
{
Callee ce = new Callee(this); //pass self to the callee
//Other functionality
//Call the Asynctask
ce.doAsynctask();
public void notify(Result result){
//Got the result after the callee has finished the task
//Can do whatever i want with the result
}
}
Функция Callee или нижнего уровня
public Class Callee {
Callback cb;
Callee(Callback cb){
this.cb = cb;
}
doAsynctask(){
//do the long running task
//get the result
cb.notify(result);//after the task is completed, notify the caller
}
}
Обратный вызов с использованием шаблона EventListener
Этот шаблон используется для уведомления от 0 до n номеров наблюдателей / слушателей о завершении конкретной задачи
Разница между механизмом обратного вызова и механизмом EventListener / Observer заключается в том, что при обратном вызове вызывающий абонент уведомляет одного вызывающего абонента, тогда как в Eventlisener / Observer вызывающий может уведомить любого, кто интересуется в этом случае (уведомление может перейти к некоторым другим частям приложения, которое не вызвало задачу).
Позвольте мне объяснить это на примере.
Интерфейс событий
public interface Events {
public void clickEvent();
public void longClickEvent();
}
[g2 4] Class Widget package com.som_itsolutions.training.java.exampleeventlistener;
import java.util.ArrayList;
import java.util.Iterator;
public class Widget implements Events{
ArrayList<OnClickEventListener> mClickEventListener = new ArrayList<OnClickEventListener>();
ArrayList<OnLongClickEventListener> mLongClickEventListener = new ArrayList<OnLongClickEventListener>();
@Override
public void clickEvent() {
// TODO Auto-generated method stub
Iterator<OnClickEventListener> it = mClickEventListener.iterator();
while(it.hasNext()){
OnClickEventListener li = it.next();
li.onClick(this);
}
}
@Override
public void longClickEvent() {
// TODO Auto-generated method stub
Iterator<OnLongClickEventListener> it = mLongClickEventListener.iterator();
while(it.hasNext()){
OnLongClickEventListener li = it.next();
li.onLongClick(this);
}
}
public interface OnClickEventListener
{
public void onClick (Widget source);
}
public interface OnLongClickEventListener
{
public void onLongClick (Widget source);
}
public void setOnClickEventListner(OnClickEventListener li){
mClickEventListener.add(li);
}
public void setOnLongClickEventListner(OnLongClickEventListener li){
mLongClickEventListener.add(li);
}
}
Клавиша класса
public class Button extends Widget{
private String mButtonText;
public Button (){
}
public String getButtonText() {
return mButtonText;
}
public void setButtonText(String buttonText) {
this.mButtonText = buttonText;
}
}
Клавиша класса
public class CheckBox extends Widget{
private boolean checked;
public CheckBox() {
checked = false;
}
public boolean isChecked(){
return (checked == true);
}
public void setCheck(boolean checked){
this.checked = checked;
}
}
Класс активности
package com. som_itsolutions.training.java.exampleeventlistener;
public class Activity implements Widget.OnClickEventListener
{
public Button mButton;
public CheckBox mCheckBox;
private static Activity mActivityHandler;
public static Activity getActivityHandle(){
return mActivityHandler;
}
public Activity ()
{
mActivityHandler = this;
mButton = new Button();
mButton.setOnClickEventListner(this);
mCheckBox = new CheckBox();
mCheckBox.setOnClickEventListner(this);
}
public void onClick (Widget source)
{
if(source == mButton){
mButton.setButtonText("Thank you for clicking me...");
System.out.println(((Button) mButton).getButtonText());
}
if(source == mCheckBox){
if(mCheckBox.isChecked()==false){
mCheckBox.setCheck(true);
System.out.println("The checkbox is checked...");
}
else{
mCheckBox.setCheck(false);
System.out.println("The checkbox is not checked...");
}
}
}
public void doSomeWork(Widget source){
source.clickEvent();
}
}
Другой класс
public class OtherClass implements Widget.OnClickEventListener{
Button mButton;
public OtherClass(){
mButton = Activity.getActivityHandle().mButton;
mButton.setOnClickEventListner(this);//interested in the click event //of the button
}
@Override
public void onClick(Widget source) {
if(source == mButton){
System.out.println("Other Class has also received the event notification...");
}
}
Основной класс
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Activity a = new Activity();
OtherClass o = new OtherClass();
a.doSomeWork(a.mButton);
a.doSomeWork(a.mCheckBox);
}
}
Как вы можете видеть из приведенного выше кода , что у нас есть интерфейс, называемый событиями, который в основном перечисляет все события, которые могут произойти для нашего приложения. Класс Widget является базовым классом для всех компонентов пользовательского интерфейса, таких как Button, Checkbox. Эти компоненты пользовательского интерфейса являются объектами, которые фактически получают события из кода структуры. Класс Widget реализует интерфейс Events, а также имеет два вложенных интерфейса: OnClickEventListener & amp; OnLongClickEventListener
Эти два интерфейса отвечают за прослушивание событий, которые могут возникнуть в компонентах пользовательского интерфейса, созданных Widget, таких как Button или Checkbox. Поэтому, если мы сравним этот пример с предыдущим примером обратного вызова с использованием интерфейса Java, эти два интерфейса работают как интерфейс обратного вызова. Таким образом, код более высокого уровня (здесь Activity) реализует эти два интерфейса. И всякий раз, когда событие возникает с виджетами, вызывается код более высокого уровня (или метод этих интерфейсов, реализованный в коде более высокого уровня, который является здесь Activity).
Теперь позвольте мне обсудить основную разницу между обратным вызовом и шаблоном Eventlistener. Как мы уже упоминали, используя Callback, Callee может уведомлять только одного Caller. Но в случае шаблона EventListener любая другая часть или класс приложения может регистрироваться для событий, которые могут возникнуть на кнопке или флажке. Примером такого класса является OtherClass. Если вы видите код OtherClass, вы обнаружите, что он зарегистрировался как прослушиватель ClickEvent, который может возникнуть в Button, определенной в Activity. Интересная часть состоит в том, что помимо Activity (Caller) этот OtherClass также будет уведомлен о каждом событии click на Button.
Функция обратного вызова - это функция, которая должна вызываться, когда выполняется определенное условие. Вместо того, чтобы немедленно вызываться, функция обратного вызова вызывается в определенную точку в будущем.
Обычно она используется, когда задача запускается, которая завершится асинхронно (т.е. закончится через некоторое время после вызова функции )
Например, функция запроса веб-страницы может потребовать от своего вызывающего пользователя функции обратного вызова, которая будет вызываться, когда веб-страница закончит загрузку.
"...when a condition is met"
, но я думал, что обратные вызовы вызываются, когда родительская функция завершает выполнение и не зависит от условий (?).
– ojonugwa ochalifu
25 July 2014 в 09:59
Функция обратного вызова - это функция, которую вы передаете (как ссылку или указатель) определенной функции или объекту. Эта функция или объект будет вызывать эту функцию в любое время позже, возможно, несколько раз для любой цели:
...
Таким образом, описание обратного вызова как функции, вызываемой в конце другой функции или задачи, слишком упрощается (даже если это общий прецедент).
Я считаю, что этот «обратный вызов» жаргон был ошибочно использован во многих местах. Мое определение будет выглядеть примерно так:
Функция обратного вызова - это функция, которую вы передаете кому-то, и позвольте им называть ее в некоторый момент времени.
blockquote>Я думаю, что люди просто прочитали первое предложение определения wiki:
обратный вызов - это ссылка на исполняемый код или часть исполняемого кода, которая передается как аргумент другому коду.
blockquote>Я работал с большим количеством API-интерфейсов, смотрю различные плохие примеры. Многие люди имеют тенденцию называть указатель на функцию (ссылку на исполняемый код) или анонимные функции (часть исполняемого кода) «обратный вызов», если они являются просто функциями, для чего вам нужно другое имя для этого?
Фактически только второе предложение в определении wiki показывает различия между функцией обратного вызова и нормальной функцией:
Это позволяет программному уровню более низкого уровня вызывать подпрограмму (или функцию), определенную в более высоком слой уровня.
blockquote>, поэтому разница заключается в том, кто вы собираетесь передать функцию и как будет передана ваша переданная функция. Если вы просто определяете функцию и передаете ее другой функции и называете ее непосредственно в этом теле функции, не называйте ее обратным вызовом. Определение говорит, что ваша переданная функция будет вызвана функцией «нижнего уровня».
Я надеюсь, что люди могут перестать использовать это слово в неоднозначном контексте, это не поможет людям лучше понять только хуже.
once its parent method completes, the function which this argument represents is then called
. Итак, если функция передается другой функции в качестве аргумента, но вызывается из среды выполнения среды родительской функции, напримерparent(cb) {dostuff1(); cb(); dostuff2()}
, то она не считается функциейcallback
? – Max Yari 26 April 2015 в 20:30