zoukankan      html  css  js  c++  java
  • 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 }
     
  • 相关阅读:
    PAT 1097. Deduplication on a Linked List (链表)
    PAT 1096. Consecutive Factors
    PAT 1095. Cars on Campus
    PAT 1094. The Largest Generation (层级遍历)
    PAT 1093. Count PAT's
    PAT 1092. To Buy or Not to Buy
    PAT 1091. Acute Stroke (bfs)
    CSS:word-wrap/overflow/transition
    node-webkit中的requirejs报错问题:path must be a string error in Require.js
    script加载之defer和async
  • 原文地址:https://www.cnblogs.com/liuwei-0313/p/10053736.html
Copyright © 2011-2022 走看看