• JS之Callback function(回调函数)


    JS中的回调函数:

    1.概念:

    函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b,那么这个过程就叫回调,即把函数作为参数传入到另一个函数中,这个函数就是所谓的回调函数。

    2.举例:

    某个项目的 A 层和 B 层是由不同的人员协同完成,A 层负责功能 funA,B 层负责 funcB,当 B 层要用到某个模块的数据,于是他对 A 层人员说,我需要你们提供满足某种需求的数据, 你给我提供一个接口,A 层的人员说: 我给你提供数据,怎么展示和处理则是 B 的事情,当然 B 层不可能为你每个需求都提供一个数据接口,B 给 A 提供一个通过的接口,B 得到数据,然后 B 写函数去展示。即,你需要和其他人合作,别人提供数据,而你不需要关注别人获取或者构建数据的方式方法。你只要对这个拿到的数据进行操作。这时候就需要使用回调函数,因此,回调本质上是一种设计模式,并且 jQuery(包括其他框架)的设计原则遵循了这个模式。

    @1:一个同步(阻塞)中使用回调的例子,目的是在 func1 代码执行完成后执行 func2。

     1 var func1=function(callback){  
     2 
     3     //do something.  
     4 
     5     (callback && typeof(callback) === "function") && callback();  
     6 
     7 }  
     8 func1(func2);  
     9 
    10     var func2=function(){  
    11 
    12 }  

    @2:异步回调的例子:

     1 $(document).ready(callback);  
     2     $.ajax({  
     3 
     4         url: "test.html",  
     5 
     6         context: document.body  
     7 
     8     }).done(function() {   
     9 
    10         $(this).addClass("done");  
    11 
    12     }).fail(function() {   
    13 
    14         alert("error");  
    15 
    16     }).always(function() {   
    17 
    18         alert("complete");   
    19 
    20     });  

    下面的比喻很生动有趣:

    你有事去隔壁寝室找同学,发现人不在,你怎么办呢?

    方法 1,每隔几分钟再去趟隔壁寝室,看人在不

    方法 2,拜托与他同寝室的人,看到他回来时叫一下你

    前者是轮询,后者是回调。

    C++中的回调函数

    1.概念:

    从概念上讲,回调函数与普通函数的本质在于:调用者的不同。普通函数由程序员代码调用,而回调函数由操作系统在适当的时间调用。   
    回调函数主要用于处各种事件和处理。由于WINDOWS系统中存在大量程序员事先不可知的事件,例如鼠标的单击,程序员事先无法得知终端用户何时会发出此动作,因此只能:  
    A定义事件的处理逻辑,与普通函数的编程一样;  
    B告之操作系统自己的处理逻辑,即通知操作系统函数指针;VC/VB等现代编程语言通过事件编程机制隐藏了这一步;  
    C操作系统在事件出现时,调用指定的函数(回调函数的概念)处理,这一步完全由系统负责。   
    回调函数在各种操作系统中普遍存在,是现代操作系统为程序员提供处理异步事件的基本机制之一,在不同的系统中的具体实现方式各不相同;请参阅随机文档Callback 函数实质就是你实现这个函数,由操作系统调用。而一般的情况下是,操作系统提供函数由你来调用的。回调函数实际上就起到了消息循环的作用,因为在sdk中只有通过回调函数来发送各自的处理消息

    2.定义:

    回调函数就是一个通过函数指针调用的函数. 如果你把函数的指针(地址)作为参数传递给另一个函数, 当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应.
     回调函数实现的机制是 : 
    (1) 定义一个回调函数;
    (2) 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
    (3) 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理.
    使用回调函数,可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数.
    3.举例:
             去宾馆后,向前台告知明天六点叫我起床,这句话说明了两个Function 1.请求叫醒服务 2.宾馆记录下来到具体时间点叫醒自己。 用代码实现这里的逻辑如下: 1.首先需要一个回调函数的接口,双方的一种约定。 2.Guest和Hotel的实体类,这里Guest需要Hotel的引用,因为服务是 Hotel提供的。其次开启一个单独的线程,来表示双方各自工作的关系。同样Hotel只需要一个具体服务的引用(Callback接口)和具体内容(这里是时间) 
    @1接口:Callback
    package com.callback.demo;
    
    public interface Callback {
               public   void callback(String result);
    }
    

    @2具体实现类Guest

     1 package com.callback.demo;
     2 
     3 public class Guest implements Callback {
     4            Hotel hotel;
     5            public Guest(Hotel hotel) {
     6                this.hotel=hotel;
     7            }
     8            //客人的告诉宾馆叫醒服务(时间)
     9            public  void  awake(String  date ) {
    10                System.out.println("走到前台。。。要求服务");
    11                //宾馆登记
    12                new Thread(new Runnable() {
    13 
    14                 @Override
    15                 public void run() {
    16                     // TODO Auto-generated method stub
    17                     hotel.recordAndWake(Guest.this, date);
    18                 }
    19 
    20                }) {
    21 
    22                }.start();
    23                //等待服务办理
    24                System.out.println("等待服务办理");
    25                try {
    26                 Thread.sleep(1000);
    27             } catch (InterruptedException e) {
    28                 // TODO Auto-generated catch block
    29                 e.printStackTrace();
    30             }
    31                doOtherThing();
    32 
    33            }
    34            //长夜慢慢  无心睡眠
    35            void  doOtherThing() {
    36                System.out.println("吃吃宵夜");
    37                System.out.println("睡觉了,等待叫醒");
    38            }
    39 
    40     @Override
    41     public void callback(String result) {
    42         // TODO Auto-generated method stub
    43         System.out.println("hotel=============叫醒服务"+result);
    44     }
    45 
    46 }

    Hotel

     1 package com.callback.demo;
     2 
     3 public class Hotel {
     4           //提供的服务  需要服务对象  以及服务内容
     5                public   void   recordAndWake(Callback callback,String  date) {
     6                    System.out.println("hotel记录时间为====="+date);
     7                    //模拟长夜慢慢
     8                    try {
     9                     Thread.sleep(5000);
    10                 } catch (InterruptedException e) {
    11                     // TODO Auto-generated catch block
    12                     e.printStackTrace();
    13                 }
    14 
    15 
    16                        date="时间到了。。。。客人";
    17                       callback.callback(date);
    18                }
    19 }

    test

     1 package com.callback.demo;
     2 
     3 public class TestCase {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7                     Hotel  hotel = new Hotel();
     8                     Guest  guest = new Guest(hotel);
     9                     guest.awake("明天早上6.00");
    10 
    11     }
    12 
    13 }
     
  • 相关阅读:
    day14(JavaDoc)
    day15(Java流程控制)
    day12
    day.6
    day10
    day11(运算符)
    day.5
    proc -x cshell fork()
    I/O -x 标准IO fopen-fclose--fgetc-fputc--fgets-fputs--fwrite-fread--fprintf-fscanf
    I/O -x open()-read()-write()-close()-lseek()
  • 原文地址:https://www.cnblogs.com/liuwei-0313/p/10053736.html
Copyright © 2020-2023  润新知