回调 订阅
回调(huí tiáo 外文名 Retracement),是指在价格上涨趋势中,价格由于上涨速度太快,受到卖方打压而暂时回落的现象。回调幅度小于上涨幅度,回调后将恢复上涨趋势。回调(huí diào 外文名 Callback),是指回调函数,编程术语。 展开全文
回调(huí tiáo 外文名 Retracement),是指在价格上涨趋势中,价格由于上涨速度太快,受到卖方打压而暂时回落的现象。回调幅度小于上涨幅度,回调后将恢复上涨趋势。回调(huí diào 外文名 Callback),是指回调函数,编程术语。
信息
定    义
指在价格上涨趋势中
分    为
回调时间、回调力度、回调量能
中文名
回调
外文名
Retracement
回调编程回调
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论回调机制在不同软件架构中的实现。对于不同类型的语言(如结构化语言和对象语言)、平台(Win32、JDK)或构架(CORBA、DCOM、WebService),客户和服务的交互除了同步方式以外,都需要具备一定的异步通知机制,让服务方(或接口提供方)在某些情况下能够主动通知客户,而回调是实现异步的一个最简捷的途径。对于一般的结构化语言,可以通过回调函数来实现回调。回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。在面向对象的语言中,回调则是通过接口或抽象类来实现的,我们把实现这种接口的类称为回调类,回调类的对象称为回调对象。对于像C++或Object Pascal这些兼容了过程特性的对象语言,不仅提供了回调对象、回调方法等特性,也能兼容过程语言的回调函数机制。Windows平台的消息机制也可以看作是回调的一种应用,我们通过系统提供的接口注册消息处理函数(即回调函数),从而实现接收、处理消息的目的。由于Windows平台的API是用C语言来构建的,我们可以认为它也是回调函数的一个特例。对于分布式组件代理体系CORBA,异步处理有多种方式,如回调、事件服务、通知服务等。事件服务和通知服务是CORBA用来处理异步消息的标准服务,他们主要负责消息的处理、派发、维护等工作。对一些简单的异步处理过程,我们可以通过回调机制来实现。
收起全文
精华内容
下载资源
问答
  • js函数的回调

    万次阅读 多人点赞 2019-07-31 19:09:41
    平常的前端开发工作中,编写js时会有很多地方用到函数的回调。 最简单的例子就是: <script language="javascript" type="text/javascript"> function doSomething(callback) { if(typeof callback == ...

    平常的前端开发工作中,编写js时会有很多地方用到函数的回调。

    最简单的例子就是:

    <script language="javascript" type="text/javascript">
    function doSomething(callback) {
    if(typeof callback == "function") {
    callback();
    }
    } 
    
    function foo() {
    alert("我是回调后执行的函数");
    } 
    
    doSomething(foo); /*正确*/
    doSomething(function(){
    alert("我是回调后执行的函数");
    }); /*正确*/
    doSomething("foo"); /* 这样是不行的,传入的是一个字符串,不是一个函数名 */
    </script>

    以上只能回调没有参数的(除法你事先知道回调的函数的参数),如果函数有未知的函数,就不能如此简单的调用了。

     

    高级方法:

    1、使用javascript的call方法

    function doSomething(callback,arg1,arg2) {
    callback.call(this,arg1,arg2);
    }
    function foo(arg1,arg2) {
    alert(arg1+":"+arg2);
    }
    doSomething(foo,1,2); /* 弹出了1:2 */

     

    2、使用javascript 的 apply方法

     

    function doSomething(callback,args) {
    callback.apply(window,args);
    }
    function foo(arg1,arg2) {
    alert(arg1+":"+arg2);
    }
    doSomething(foo,[1,2,3]); /* 弹出了1:2 */

    可以看成call和apply基本一样,区别就是call只能一个个传参数,apply只能把参数放数组里传进来

    他们的第一个参数都是作用域,比如上面传了this,表示就是和doSomething这个函数一样的作用域,当然你也可以传window,表示整个window的作用域

     

    3、apply的巧妙用法

    apply也可以看作是函数的执行函数,就是用来执行某个函数的函数。所以你会发现,有时候用好apply,有很多原本繁杂的事情会变得如此简单。

    比如数组的push方法使用apply来调用:

    var arr1=[1,3,4];

    var arr2=[3,4,5];

    如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]

    arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]

    我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)

    var arrLen=arr2.length

    for(var i=0;i<arrLen;i++){

        arr1.push(arr2[i]);

    }

    自从有了Apply,事情就变得如此简单

    Array.prototype.push.apply(arr1,arr2)

    一行代码就解决了,原理能看的出来,Array.prototype.push是指数组的push函数,apply(arr1,arr2)说明arr1是作用域,就等同于是arr1调用了数组的push函数,

    而且arr1的确就是个数组,所以可以调用,arr2表示入参的数组。所以,以上语句等同于:arr1.push(3,4,5)。(push函数支持传递多个入参,这也是这里可以使用apply的前提条件)

    以上语句也可以写成:arr1.push.apply(arr1,arr2); 两者完全等效,因为arr1.push表示arr1的push函数,也就是数组的push函数。

    如果使用call就是这样Array.prototype.push.call(arr1,arr2[0],arr2[1]...),显然还是apply合适。

    要是你还问,那直接用arr1.push(3,4,5)不就行了,那已经暴露了你的智商,arr2又不是不可以变,下次不是[3,4,5]了呢。

     

    还有获取数组中,最大的那个数字,也可以使用apply调用Math.max函数

    var arr1=[1,3,4];

    alert(Math.max.apply(window,arr1)); /* 作用域可以不是window,就算是null都行,Math.max.apply(this,arr1),Math.max.apply(null,arr1) */

     

    4、工作中函数回调的实际例子

    有了上面的基础,就能看的懂工作中封装好的js的回调函数了

    背景:页面A需要使用页面B来选择某个项目,然后带回这个项目的信息给页面A,页面A根据这些信息丰富自己。

    页面A:

    noticeInfo = {
    selectProject: function () {
    var win = newsee.ui.window
    win.show('项目列表', '../Project/ProjectSelectList.html?callback=noticeInfo.setProjectInfo', { size: win.winSizeType.big })
    //在当前页面弹出框,框里面是另一个页面,地址后面带上需要回调的函数名
    //注意这两个页面其实都是在一个页面里面的,并不是像window.open()那样出现了新窗口,所以两个页面的js都是可见的
    },
    setProjectInfo: function (obj) {
    //回调函数,将选择好的项目对象传进来,然后丰富自己的页面
    $('#projectName').val(obj.name)
    $('#projectID').val(obj.id)
    }
    }

    页面B:

    function SelectBack() {
    var callback = newsee.util.url.getQuery('callback'); //获取页面参数callback,这里获取到的是"noticeInfo.setProjectInfo",是个字符串
    var arr = newsee.ui.grid.getSelectedBack('datagrid') //获取选择的项目,这个不用深究
    if (!arr.length) {
    return newsee.ui.window.alert('请选择项目!')
    }
    newsee.util.url.back(callback, arr[0]) //重点来了,这里执行回调,将需要回调的函数名和入参传进来,arr[0]就是选择的项目的对象的数组了(它也是个数组,里面就一个对象)
    }

    newsee.util.url.back函数如下:

    back : function (funcName) {
    // / <param name="funcName" type="String">返回时执行的方法,一般为重新绑定</param>
    
    var isWindow = typeof $$winClose === 'function',// 是否为弹窗
    args // 弹窗返回方法参数
    
    if (isWindow) {// 弹窗的返回方法
    $$winClose()
    
    args = [].slice.call(arguments) //arguments大家应该都知道的吧,它可以用来获取函数的实参,它类似数组又不是数组,这句代码就是把它转换成数组,因为apply的入参需要是个数组才行
    //args现在里面有两个元素,args[0]=callback,就是之前传进来的回调函数名,args[1]=arr[0],就是回调函数的入参
    newsee.callFunc.apply(newsee, args) //执行 newsee.callFunc 函数,作用域就是newsee自己(等同于newsee自己调用callFunc函数),参数是args
    } 
    }

    newsee.callFunc函数如下:

    callFunc: function(funcName, arg) {
    var func = typeof funcName === 'function' ? funcName : this.findItem(window, funcName) //上面我有提到过,doSomething("foo"); 传入的是一个字符串,不是一个函数名,所以无法执行
    //同样的道理,现在funcName=args[0]=callback="noticeInfo.setProjectInfo",是个字符串,不能直接调用apply,需要变成函数
    //这句话就是用来判断funcName是不是一个函数,如果不是,就在window作用域里根据funcName找到这个函数,然后赋给func
    if (typeof func === 'function') {
    //此时func已经是个函数了,就是页面A里定义的noticeInfo.setProjectInfo()
    try {
    return func.apply(window, arg) //执行需回调的函数,作用域依然是window,反正这个函数在window里肯定能找到,参数就是arg=args[1]=arr[0],即之前在页面B获取到的项目对象
    }
    catch (e) {
    console.error(e)
    }
    }
    }

    ok,需回调的函数就这样被执行了,至于怎么根据字符串形式的函数名获取这个函数,看下面。

    //findItem函数如下:
    findItem: function(data, key) {
    // / <summary>获取对象指定键的值</summary>
    if (this.include(data, key)) { //data这里就是传进来的window,注意window就是一个对象,首先判断window对象里是否存在"noticeInfo.setProjectInfo"这个属性
    return eval('data.' + key) //如果存在,就执行"data.noticeInfo.setProjectInfo",这样就获取到了这个函数了。(eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码)
    }
    }
    //include函数如下:
    include: function(data, key) {
    // / <summary>判断对象是否存在键值</summary>
    if (data == null || typeof data !== 'object' || !key || typeof key !== 'string') {
    return false
    }
    var keys = key.split('.'),
    item = data,
    result = true
    keys.forEach(function(k) {
    if (item != null && typeof item === 'object' && k in item) {
    //依次循环遍历,第一次item = data,那就是window这个对象,k="noticeInfo",window[noticeInfo]是存在的,因为在页面A里定义了noticeInfo这么一个对象
    //第二次循环,item=window.noticeInfo,k="setProjectInfo",window.noticeInfo[setProjectInfo]也是存在的,因为在页面A里也定义了setProjectInfo这么一个函数
    //这里没有第三次循环了,所以最后返回是true,说明window对象里存在"noticeInfo.setProjectInfo"这个属性,接下来使用eval()拿到它即可
    item = item[k]
    } else {
    return result = false
    }
    })
    
    return result
    }

    对eval() 函数也介绍一下:

    eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

    返回值就是通过计算 string 得到的值(如果有的话)。如:

    eval("x=10;y=20;document.write(x*y)") //输出 200

    document.write(eval("2+2")) //输出 4

    var x=10

    document.write(eval(x+17)) //输出 27

    所以上面的eval('data.' + key)就是执行"data.noticeInfo.setProjectInfo"这个字符串,

    因为data在这里就是指window,所以返回值就是window.noticeInfo.setProjectInfo()这个函数

     

    其实可以在简单一点,根本没必要使用eval()来获取这个函数,因为在include函数里,item就已经是window.noticeInfo.setProjectInfo这个对象了,这个对象就是我们想要的函数。

    (在js中函数也是对象,函数名就是这个函数的引用,就和地址差不多)

    既然都拿到这个函数了,直接返回不就行了,所以上面的include()和findItem可以这样简化:

    include: function(data, key) {
    if (data == null || typeof data !== 'object' || !key || typeof key !== 'string') {
    }else{
    var keys = key.split('.'),
    item = data,
    result = true
    keys.forEach(function(k) {
    if (item != null && typeof item === 'object' && k in item) {
    item = item[k]
    } else {
    result = false;
    }
    })
    if(result)
    return item
    }
    },
    findItem: function(data, key) {
    return this.include(data, key)
    }

    经过测试,发现这两个根据字符串形式的函数名获取函数的方法都可以达到一模一样的效果。

    ------------------------------------------------------------------------声明-------------------------------------------------------------
    以上部分是copy别人的,部分是自己的理解!
    本人水平有限,如有不对之处,还望大神指正,谢谢!

    展开全文
  • 回调函数 同步回调 异步回调

    千次阅读 2018-06-11 16:56:34
    回调函数一般是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此时有两种方式: ...

    目录

    回调函数

    同步回调和异步回调

    同步回调

    异步回调


    回调函数

    回调函数一般是在封装接口的时候,回调显得特别重要,我们首先假设有两个程序员在写代码,A程序员写底层驱动接口,B程序员写上层应用程序,然而此时底层驱动接口A有一个数据d需要传输给B,此时有两种方式: 

    1. A将数据d存储好放在接口函数中,B自己想什么时候去读就什么时候去读,这就是我们经常使用的函数调用,此时主动权是B。 
    2. A实现回调机制,当数据变化的时候才将通知B,你可以来读取数据了,然后B在用户层的回调函数中读取速度d,完成OK。此时主动权是A。 

    很明显第一种方法太低效了,B根本就不知道什么时候该去调用接口函数读取数据d。而第二种方式由于B的读取数据操作是依赖A的,只有A叫B读数据,那么B才能读数据。也即是实现了中断读取。 
    那么回调是怎么实现的呢,其实回调函数就是一个通过函数指针调用的函数。如果用户层B把函数的指针(地址)作为参数传递给底层驱动A,当这个指针在A中被用为调用它所指向的函数时,我们就说这是回调函数。 
    注意:是在A中被调用,这里看到尽管函数是在B中,但是B却不是自己调用这个函数,而是将这个函数的函数指针通过A的接口函数传自A中了,由A来操控执行,这就是回调的意义所在。 

    同步回调和异步回调

    首先,理解几个概念:

    1. 回调可以是同步也可以是异步
    2. 同步可以是单线程也可以是多线程

       异步必须是多线程或多进程(每个进程可以是单线程) ==> 换句话说,异步必须依靠多线程或多进程才能完成

     

    同步回调:把函数b传递给函数a。执行a的时候,回调了b,a要一直等到b执行完才能继续执行;

    异步回调:把函数b传递给函数a。执行a的时候,回调了b,然后a就继续往后执行,b独自执行。

    直接看例子

    A.h

    #ifndef A_H
    #define A_H
    typedef void (*pcb)(int a); //函数指针定义,后面可以直接使用pcb,方便
    void SetCallBackFun(int a, pcb callback);
    #endif

    同步回调

    synA.c

    #include <stdio.h>
    #include "A.h"
    
    //-----------------------底层实现A-----------------------------
    
    //留给应用层B的接口函数
    void SetCallBackFun(int a, pcb callback)
    {
        printf("A:start\n");
        callback(a);
        printf("A:end\n");
    }
    

    synB.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include "A.h"
    //-----------------------应用者B-------------------------------
    void fCallBack(int a)       // 应用者增加的函数,此函数会在A中被执行
    {
        //do something
        printf("B:start\n");
        printf("a = %d\n",a);
        sleep(5);
        printf("B:end\n");
    }
    
    int main(void)
    {
        SetCallBackFun(4,fCallBack);
        return 0;
    }

    异步回调

    asynA.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    #include "A.h"
    
    //-----------------------底层实现A-----------------------------
    typedef struct parameter{
        int a ;
        pcb callback;
    }parameter;
    
    void* callback_thread(void *p1)//此处用的是一个线程
    {
        //do something
        parameter* p = (parameter*)p1 ;
    
        sleep(5);
        p->callback(p->a);//函数指针执行函数,这个函数来自于应用层B
    
    }
    
    //留给应用层B的接口函数
    void SetCallBackFun(int a, pcb callback)
    {
        printf("A:start\n");
        parameter *p = malloc(sizeof(parameter)) ;
        p->a  = a;
        p->callback = callback;
        
        //创建线程
        pthread_t pid;
        pthread_create(&pid,NULL,callback_thread,(void *) p);
        printf("A:end\n");
    	
        //阻塞,等待线程pid结束,才往下走
        pthread_join(pid,NULL);
    }
    

    asynB.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include "A.h"
    //-----------------------应用者B-------------------------------
    void fCallBack(int a)       // 应用者增加的函数,此函数会在A中被执行
    {
        //do something
        printf("B:start\n");
        printf("a = %d\n",a);
        sleep(5);
        printf("B:end\n");
    }
    
    
    int main(void)
    {
        SetCallBackFun(4,fCallBack);
        return 0;
    }

    运行结果比较:

     

    同步回调 异步回调
    A:start
    B:start
    a = 4
    B:end
    A:end
    A:start
    A:end
    B:start
    a = 4
    B:end

    由执行结果可以看出:同步回调,A需要等待B执行完成才能执行A剩余的操作;异步回调,A刚执行B,不必等待B结束,就执行A剩余的操作,之后B的操作也随之end。

    展开全文
  • 深入理解:回调函数

    万次阅读 多人点赞 2019-06-21 15:36:09
    关于回调函数到底是什么,已经困扰了我很久了~ 在知乎上看到几位大神的帖子,才恍然大悟 作者:no.body 链接:https://www.zhihu.com/question/19801131/answer/27459821 来源:知乎 作者:常溪玲 链接...

    关于回调函数到底是什么,已经困扰了我很久了~

    在知乎上看到几位大神的帖子,才恍然大悟

    作者:no.body
    链接:https://www.zhihu.com/question/19801131/answer/27459821
    来源:知乎

    作者:常溪玲
    链接:https://www.zhihu.com/question/19801131/answer/13005983
    来源:知乎

    首先要明确的一点是,函数也可以作为函数的参数来传递

    好了,有了这个概念我们来说明回调函数到底是怎么回事

    首先至少要有 3 种类型的函数

    • 主函数:相当于整个程序的引擎,调度各个函数按序执行

    • 回调函数:一个独立的功能函数,如写文件函数

    • 中间函数:一个介于主函数和回调函数之间的函数,登记回调函数,通知主函数,起到一个桥梁的作用

    接下来我们一起来看下示例代码:

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    
    # 回调函数1
    def callback1(x):
        return x * 2 
    
    # 回调函数2
    def callback2(x):
        return x ** 2
    
    # 中间函数
    def middle(x, func):
        return 100 + func(x)
    
    # 主函数
    def main():
    
        x = 1 
    
        a = middle(x, callback1)
        print(a)
    
        b = middle(x, callback2)
        print(b)
    
        c = middle(x, lambda x: x + 2)
        print(c)
    
    main()
    

    运行结果:

    102
    101
    103
    

    代码看懂以后我们接下来分析一下代码的逻辑

    首先我们在主函数执行过程中需要用到一个功能 x * 2,而 callback1 函数就提供这个功能,我们就把这个函数称之为 回调函数(至于为什么要叫“回调函数”,不能叫别的呢?其实这只是人为规定的一个名字。你也可以叫“极客点儿专属函数”,但是到时候你又会问为什么要叫“极客点儿专属函数”,它特么的总的有个名字吧!所以叫“回调函数”就是王八的屁股:规定!)。

    这时候我们的 主函数 要调用它,但是有的时候在开发过程中遇到需要写硬盘的操作,这时候我们为了避免程序的阻塞,就需要用到异步 I/O。就是你自己先写着玩儿,爸爸去干别的事情去了,等你完事儿再来通知我。正是因为这种机制所以得有一个 登记回调函数通知主函数执行完成 的“地方”,这个地方就是 中间函数

    有上述内容我们就可以推导出回调函数执行的流程了:

    1. 主函数需要调用回调函数

    2. 中间函数登记回调函数

    3. 触发回调函数事件

    4. 调用回调函数

    5. 响应回调事件

    回调实际上有两种:阻塞式回调延迟式回调 也可以叫做 同步回调异步回调

    两者的区别在于:

    在阻塞式回调里,回调函数的调用一定发生在主函数返回之前

    在延迟式回调里,回调函数的调用有可能是在起始函数返回之后

    上述示例均为 同步回调,异步需要用到多进程、多线程、协程这些概念,下次有机会再说

    最后用一个例子说明一下到底说明是回调函数:

    你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。

    在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做 触发回调事件,店员给你打电话叫做 调用回调函数,你到店里去取货叫做 响应回调事件

    展开全文
  • 异步回调与同步回调

    千次阅读 2018-05-22 19:13:35
    同步回调 我们常用的一些请求都是同步回调的,同步回调是阻塞的,单个的线程需要等待结果的返回才能继续执行。异步回调 有的时候,我们不希望程序在某个执行方法上一直阻塞,需要先执行后续的方法,那就是这里的...

    同步回调

            我们常用的一些请求都是同步回调的,同步回调是阻塞的,单个的线程需要等待结果的返回才能继续执行。


    异步回调

            有的时候,我们不希望程序在某个执行方法上一直阻塞,需要先执行后续的方法,那就是这里的异步回调。我们在调用一个方法时,如果执行时间比较长,我们可以传入一个回调的方法,当方法执行完时,让被调用者执行给定的回调方法。


    异步回调java实现demo


    client接口

    public interface Client {
    	
    	// 调用服务提供者的处理方法
    	void process(int a,int b);
    
    	//  异步回调方法
    	void result(int i);
    
    }

    clientA类实现client接口

    public class ClientA implements Client{
    	
    	// 初始化一个私有服务提供者
    	private Server server;
    	
    	public ClientA(Server server){
    		this.server = server;
    	}
    
    	@Override
    	public void process(int a,int b) {
    		ClientA c = this;
    		// 这里启用另一个线程,让此线程继续执行
    		new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				server.add(a,b,c);
    				
    			}
    		}).start();;
    		System.out.println("ClientA process end");
    	}
    
    	//异步返回结果
    	@Override
    	public void result(int i) {
    		System.out.println("ClientA result is :"+i);
    	}
    
    }

    clientB类实现client接口

    public class ClientB implements Client{
    	
    	// 初始化一个私有服务提供者
    	private Server server;
    
    	public ClientB(Server server){
    		this.server = server;
    	}
    	
    	@Override
    	public void process(int a,int b) {
    		ClientB c = this;
    		// 这里启用另一个线程,让此线程继续执行
    		new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				server.add(a,b,c);
    				
    			}
    		}).start();;
    		System.out.println("ClientB process end");
    	}
    
    	//异步返回结果
    	@Override
    	public void result(int i) {
    		System.out.println("ClientB result is :"+i);
    		
    	}
    
    }

    server类

    public class Server {
    
    	public void add(int i, int j,Client client) {
    		// 要返回的结果
    		int res = i+j;
    		// 线程休息2秒
    		try {
    			Thread.sleep(2000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		// 调用异步通知方法
    		client.result(res);
    	}
    
    }

    测试Test类

    public class Test {
    
    	public static void main(String[] args) {
    		Server server = new Server();
    		
    		ClientA clientA = new ClientA(server);
    		clientA.process(5,6);
    		
    		ClientB clientB = new ClientB(server);
    		clientB.process(50,60);
    
    	}
    
    }

    执行结果是

    ClientA process end
    ClientB process end
    ClientA result is :11
    ClientB result is :110
    展开全文
  • 一个经典例子让你彻彻底底理解java回调机制

    万次阅读 多人点赞 2013-03-21 23:43:28
    以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反...
  • 回调机制java

    万次阅读 2020-08-19 17:16:35
    回调是什么 回调方将本身传递给调用方,这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息。 类A的a()方法调用类B的b()方法 类B的b()方法执行完毕主动调用类A的callback()方法 简单来说就是A类中调用B类...
  • 回调:简单来说,就是我调用你的函数,你调用我的函数。正规一点的说法就是类A的a()函数调用类B的b()函数,当类B的b()函数的执行时又去调用类A里的函数。是一种双向的调用方式。一般情况下,回调分两种,分别是同步...
  • kotlin lambda (kotlin回调和java回调)

    千次阅读 2020-03-21 16:39:13
    kotlin回调和java回调kotlin回调和java回调的对比kotlin的回调java的回调 kotlin回调和java回调的对比 废话不多说,人狠话不多,直接撸代码: kotlin的回调 class A{ fun setListeren(canshu1:Int,mListen: (String...
  • java接口回调、同步回调、异步回调

    千次阅读 2016-05-15 16:20:37
     回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调。  例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给...
  • 通俗理解“回调函数”

    万次阅读 多人点赞 2018-06-24 20:42:26
    我们先来看看回调的英文定义:A callback is a function that is passed as an argument to another function and is executed after its parent function has completed。字面上的理解,回调函数就是一个参数,将这...
  • java 回调机制分为:异步回调 同步回调 模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;回调是一种双向的...
  • 回调函数

    千次阅读 多人点赞 2019-09-09 17:36:28
    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定...
  • 理解支付宝同步回调和异步回调

    万次阅读 2018-09-07 17:22:00
    支付宝同步回调和异步回调 当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用。 很多新手会拿这个结果 当作支付成功了,那就会被...
  • Android 开发中异步回调改成同步回调

    千次阅读 2019-04-04 10:21:42
    在 Android 开发中,遇到的很多回调情况都是异步回调,比如访问网络、访问本地文件或数据库等等,在子线程中进行这些操作,然后等结果返回后,再来到主线程进行 UI 更新等动作。这也是习以为常的事情了,那么如何将...
  • 一、支付宝回调接口 回调:分布式事物解决方案。 1、通知结果:分为 同步通知: 以浏览器方式重定向到网站上去。 异步通知:支付宝会以httpclient技术更改订单状态。 为什么项目要做服务化? 服务化的...
  • 回调函数的作用和用途,我就不多说了,之前也讨论过, 现在再来熟悉一下与回调函数相关的程序。 我们知道, 回调机制, 就是通过函数指针来实现的。 说白了, 就是注册与回调。 下面,直接上菜, 希望大家品尝...
  • useState回调函数

    千次阅读 2020-04-20 14:21:42
    在看的小朋友,新的react hook写法,官方默认setState方法移除了回调函数,推荐使用useEffect,但是改动的数据过多还是有很多问题。so,我在useState基础上扩展了回调函数功能,就可以像以前类写法一样传递回调方法...
  • Java回调~mqtt回调处理中的问题

    万次阅读 热门讨论 2016-08-01 11:19:12
    1. java回调机制 回调方法的理解: 例子:  消防员给出一个电话号码119(这是每个人都知道的,119就相当于Java中的一个接口),并在每一个地方都设置一个发生火灾时的检测装置,如果危急到人们的人生安全时,...
  • 异步实现:回调回调和消息队列

    千次阅读 2019-04-01 20:13:35
    异步实现方式一:异步回调 异步回调的实现依赖于多线程或者多进程 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。 同步调用是一种阻塞式调用,调用方要等待对方...
  • 同步回调与异步回调的实现与学习

    千次阅读 2018-01-29 14:44:15
    这段时间学习java的回调机制,在网上包括博客寻找了许多关于回调的一些文章和文献,最终自己尝试着理解和写了一些回调的实现用作学习理解,话不多说,直接上主菜。(本人新人入坑,只是阐述了自己的理解与实现,欢迎...
  • 微信支付接口--支付成功的回调--超详细Demo

    万次阅读 多人点赞 2018-07-30 16:56:52
    写微信支付成功回调的代码,尤其要注意官方文档的一句话: 如果不注意这里,支付成功后微信会一直对这个地址进行调用,更新订单的对数据库进行操作,也会一直存在更新:...
  • 回调指针回调函数的使用(C语言)

    千次阅读 多人点赞 2017-07-21 15:59:05
    回调函数的使用 回调函数在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针。 1. 回调指针 概念:指针是一个变量,是用来指向内存地址...
  • JS回调函数——简单易懂有实例

    万次阅读 多人点赞 2018-05-11 17:33:02
    初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数。什么是JS?(点击查看) 下面先看看标准的解释: <script language="javascript"> 02 function SortNumber( obj, func ) // ...
  • 那么,回调函数是个什么鬼呢?它和函数到底有何异同?既然已经有了函数,为啥还非要生出个回调函数来?想必,小伙伴们在刚碰到这个概念的时候,都会被这些问题困扰。网上搜一搜,有很多相关的材料,但是未必透彻。我...
  • Java 简单理解回调回调方法

    千次阅读 2018-03-04 10:34:14
    什么是回调?软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用...
  • 什么是接口回调? 1.接口回调是什么[2]? 接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的...
  • c++回调函数/ROS回调函数

    千次阅读 多人点赞 2018-01-09 10:15:58
    以下均是个人在实际耕码的过程中遇到的问题和整理的结果,可能会有不对的地方,望各位指正与交流 -------------------------------------------------我会有...c++中的回调函数: A "callback" is any function th...
  • 微信支付回调到底回调了什么?

    千次阅读 2018-05-18 18:31:46
    我们在用TP开发微信支付时,微信支付进行回调回调的内容里面,到时回调了些啥 ?具体上代码:&lt;xml&gt; &lt;appid&gt;&lt;![CDATA[XXX]]&gt;&lt;/appid&gt; AppID &lt;...
  • 实现Bean初始化回调和销毁回调各有三种方法,一是实现接口方法,二是在XML配置,三是使用注解初始化回调1、使用接口org.springframework.beans.factory.InitializingBean接口类的作用是:在容器设置bean必须的属性...
  • 详解Android中接口回调、方法回调

    万次阅读 多人点赞 2018-04-26 10:26:13
    转载地址:http://www.jb51.net/article/102520.htmhttps://blog.csdn.net/u010566681/article/details/52371359我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 130,858
精华内容 52,343
关键字:

回调