精华内容
下载资源
问答
  • 安装一定要看到安装的结尾,最后...**调试的时候,控制台如果出现错误就要思考怎么引起的,控制台是运行时的错误 ** gitbash是按语法检验是否是对的,只要没有语法错误,都可以编译成功 这个窗口必须要看,inlin...

    安装一定要看到安装的结尾,最后告诉你多少个包安装了,才叫完成,所以npm install/npm i/yarn,都需要安装完成,不然有些包没安装,启动服务就会报错,因为启动的时候包不加载就会出错,必须安装完包。
    在这里插入图片描述
    **调试的时候,控制台如果出现错误就要思考怎么引起的,控制台是运行时的错误 **
    在这里插入图片描述
    gitbash是按语法检验是否是对的,只要没有语法错误,都可以编译成功
    在这里插入图片描述
    这个窗口必须要看,inline就是打印到窗口里的

    在这里插入图片描述
    大多数控制台的错误都是你写错了在这里插入图片描述
    我们可以用antdesigner改成前端比较好看的

    现在启动,不要求后端8000一定启动,代理是有请求才代理,现在没有活,没有请求是没事的
    在这里插入图片描述
    这一次是用分层的方式,不管写的是不是微服务之类的,代码都需要分层次(我们不可能把代码写到一个componet目录里,src目录里全是js,这样肯定不方便管理,按照道理之前的index和componet也需要放到组件里去,但是太过简单就没放)
    service
    css,所有的css放在这里。
    如果组件太多,就按照业务来分,user相关,博客相关的。现在javascript也提供了模块化的管理,代码需要组织好,模块化的管理就是告诉我们可以用目录来组织好

    视图层就是一个个组件,这些组件放到componet里,
    服务层放到service目录里,在service里要写XXservice,专门为这个业务提供服务
    model专门负责数据,服务端才相当于数据库,如果内容比较多也可以提出来一层

    先看看视图层和服务层的交互

    在这里插入图片描述
    在view层视图上有一个button,一 click就会触发一个事件,在这个事件响应的函数中,需要写一些东西,,比如登录页,一点按钮,就得按照登录框里的邮箱密码拿到之后,需要和后台联系,8000端口的。
    在django写login刚好需要邮箱密码,首先拿到email查数据库,查到之后,拿到密码,bcrypt,直接进行checkpw

    我们需要解析body里的数据,把email和password提取出来,然后进行验证。我click之后应该调用service层,service层其实就是一个service对象,调用里面的函数,里面会来解决问题。
    视图层是组件,组件只解决事件响应,它只管把数据提交到服务端去,由service再发送http,ajax请求

    在这里插入图片描述
    组件这块需要解决响应事件的问题,然后调用service层login
    在这里插入图片描述
    在service层里写一个user.js
    在这里插入图片描述
    在service层里写一个user.js,是user服务的js,跟业务相关了,这一层不做可视化的问题,所有的可视化都是component react组件。这里只做二传手,将视图层提起的请求到它这边转换成http请求。
    也需要导出。
    不需要任何可视化的,这是个普通的类,不是组件类,组件要继承自react-component,然后里面写render。
    这个就不需要,这个就是一个普通类,就是完成后台或者是django服务器的交互

    第一要接收俩个参数
    在这里插入图片描述
    打印看看能不能最后拿到这两样东西

    在这里插入图片描述
    回到component的login,这里需要调用,会返回一个新的函数,新的函数就跟onclick捆绑在一起了
    在这里插入图片描述
    写完这个函数,需要拿到邮箱密码,先看看这个target是不是button
    在这里插入图片描述
    闪了一下,是最传统的方式
    在这里插入图片描述
    应该阻止闪,阻止默认行为
    在这里插入图片描述
    现在不闪了,把默认提交动作阻止了,我们要用异步的提交方式,本页不刷新,后面发起ajax请求,然后通过ajax请求到后端交互,基本不用同步技术。直到验证成功才跳转到登录页
    在这里插入图片描述
    点很多次还是这个东西
    在这里插入图片描述
    加个这个看看

    在这里插入图片描述
    form拿到了,里面可以拿到元素
    在这里插入图片描述
    在这里插入图片描述
    邮箱密码拿到了,form表单通过这样来拿
    在这里插入图片描述
    这样就可以当作数组来用,通过解构的方式把这两个东西提取出来
    在这里插入图片描述
    用解构也可以
    在这里插入图片描述
    下面就是想去调用一个service的login,这里都需要写个东西.为什么service/user不写js后缀,因为在配置文件里帮你加了后缀了
    在这里插入图片描述
    这样类就创建完了

    在这里插入图片描述
    表单元素的值就直接拿value,先这么试试
    在这里插入图片描述
    user.js两个波浪线直接就是它在这里插入图片描述
    说明调了,我们只要在service做二传手,传到服务器上去,等它回来即可。正常用jQuery也可以,但是现在我们用另一个
    在这里插入图片描述
    我们现在填写默认value,省的每次测试填写,这两个方式都叫写字符串
    在这里插入图片描述
    这两个值就过去了

    在这里插入图片描述
    但是这样不好,能否通过外部方式把service注入进来
    在这里插入图片描述
    外部注入对react来讲,应该用props,内部用status。外部用props传进来

    这样相当于把原来的包了一层
    在这里插入图片描述
    包了一层主要是为了传一个属性,谁等于谁就放到了props里去了
    在这里插入图片描述
    下面就可以这么调用,不应该用全局变量,用这种方式来传
    在这里插入图片描述

    通过外部将这个props,给这个组件注入了一个service
    在这里插入图片描述
    这个servcie就是new service的实例,new service实例就可以调用 login,就需要两个参数
    在这里插入图片描述
    照样拿到了

    在这里插入图片描述
    用这种方式就有完成一个属性的外部注入,如果以后想要以后使用一些东西,用注入的方式比较方便
    在这里插入图片描述
    在这里插入图片描述
    实现click函数,就可以调用上面的handleclick
    在这里插入图片描述
    点击页面刷新,说明走的是默认提交方式,本页面不应该这么提交,为了不让他提交就要调用event.preventdefault(),阻止默认提交
    在这里插入图片描述
    在表单控件里产生了这样的效果的组件,调用完之后.form可以获得form表单,form表单所有管理的组件会放在一个数组当中,所以可以从数组当中去拿,第0个是邮箱,第1个是密码

    在这里插入图片描述
    准备让service来使用,使用全局变量的方式不太好,所以在使用的情况下,不使用全局变量,应该通过构造器里的属性注入进来。
    还可以用props

    在这里插入图片描述

    在这里插入图片描述
    叫userservice还是service随便

    在这里插入图片描述
    数组的第一项和第二项都提交给login
    在这里插入图片描述
    这个代码里没有和后台的交互,view只管接收用户点击事件,然后提起一些请求,但是请求最后变成什么样不关心,这个事情就交给另外的service来管
    在这里插入图片描述
    service就是把你的请求转换成和服务器间的请求,如何找到这个service,最好的方式是通过属性注入的方式,通过props来写,这是react推荐使用的,外部的就用props,内部就用status
    在这里插入图片描述
    props注入后,就可以调用到service上去了
    在这里插入图片描述

    在这里插入图片描述
    下面到service了

    在这里插入图片描述
    而service想跟后台服务器关联起来
    在这里插入图片描述
    首先需要再确认一点,配置文件里有没有写对
    在这里插入图片描述
    这里的意思是当你发起对3000端口的访问,也就是devserver启动的网站,如果对网站下的数据要进行访问,访问下面的api,就会访问8000后端地址,会将请求转发
    在这里插入图片描述
    需要用axios异步库
    在这里插入图片描述
    看下官方的怎么做
    在这里插入图片描述
    axios是基于promise实现的,promise是异步,承诺做好事情后来做些事情,这是异步,也就是先执行,后面写then ,catch。then可以处理状态成功的失败的,fullfill的,reject的,catch是捕获错误的,它是基于promise实现 异步的东西。可以在浏览器和nodejs,也就是前端和到后端的nodejs中去跑,两头都可以跑。
    在这里插入图片描述
    有这些功能:
    从浏览器中创建xmlhttprequests,利用这个组件发送ajax请求到后端。
    还可以从node.js中请求;
    支持promise API,因为是基于promise;
    拦截请求和响应,因为发的请求,就有可以处理请求和响应;
    转换请求数据和响应数据;
    取消请求;
    自动转换json数据,只要是json格式都可以转换成json对象来使用;
    客户端支持防御XSRF,其实就是csrf

    在这里插入图片描述
    IE8.0以上才支持(嫌弃支持不好,就用jquery的ajax,原生来做),678基本上是灾难,兼容性特别差,8以后,微软就意识到,不兼容会失去浏览器市场,在edge对标准支持非常好
    在这里插入图片描述
    安装npm install

    在这里插入图片描述
    也可以用cdn加速

    在这里插入图片描述
    get请求,现在是提交用户名和密码,现在有两种方式,1.把用户名和密码转变成get方法的查询字符串
    在这里插入图片描述
    或者通过post方法来提交
    在这里插入图片描述
    最后都有失败了怎么办成功 了怎么办
    在这里插入图片描述
    post也是成功了怎么办,失败了怎么办
    在这里插入图片描述
    还可以提交多个请求,然后对所有的进行拦截在这里插入图片描述
    抄一下这个
    在这里插入图片描述
    先看看能不能拿到,导入axios,这样写法,都是安装在site-packages里了,这个相当于全局包了
    在这里插入图片描述这个是全局可以这么用,自己写的就需要用相对
    在这里插入图片描述
    在这里插入图片描述

    跑到配置里,发送到8000端口,这是代理的功能,只要是api开头,就会把请求转发给后端8000端口服务器
    在这里插入图片描述
    现在在前端点一个按钮,就是在表单中提取两个数据,然后两个数据传到这个函数里,这个函数调用后,会发送一个异步请求,就跑到后端
    在这里插入图片描述
    使用试试
    在这里插入图片描述
    后端看下,传过来的数据到底是什么,先发一下数据,看是在body还是在post里
    在这里插入图片描述
    提交
    在这里插入图片描述这里返回404
    在这里插入图片描述
    这里多了个api就不能访问了

    在这里插入图片描述

    也就是devserver的配置出了问题,把api一起转给你了,没有去掉
    在这里插入图片描述
    这时候需要用到路径重写功能,rewrite,意思是配置了pathrewrite,将api开头 替换成空
    在这里插入图片描述
    配置文件变了,就需要重启
    在这里插入图片描述
    再次提交,400就对了,发的数据不对
    在这里插入图片描述
    是在body里出的数据,post里没有数据,既然数据这么来就可以把body的数据改造成认为ok的东西
    在这里插入图片描述
    在这里插入图片描述
    进行改造,前面属性名:后面变量

    在这里插入图片描述
    再次提交看看
    在这里插入图片描述
    token拿到就成功 了

    在这里插入图片描述
    login这里,click事件结束调用完了,异步调用,调用完立即结束了,这边handleclick不会等你,promise就是执行完了,异步等then,等catch
    在这里插入图片描述
    这边早就结束了,拿数据查询验证都很慢的,要等好几秒,这个函数如果用login,里面基于了promise的axios的请求的话,这个函数一旦执行就立马结束了,就不会再等了,这个调用已经结束了
    在这里插入图片描述
    这个是异步调用,可以在回调里执行这个问题
    在这里插入图片描述
    测试已经成功了,先注释掉,现在试试做出一种同步的方式
    在这里插入图片描述
    内部的方式是调用这个login之后,只要login不返回就需要一直等着,当我们点击onclick之后调用,这个函数就卡在这里,等着返回
    在这里插入图片描述在这里插入图片描述
    可以有个返回值,需要刷新,就要变化,render函数刷新,就是state东西,对react来讲最有用的两样东西就是props和state,state变化之后一定引起render函数调用,props有流程。props变化是外部引起的,要多走一个函数,state和props都要经过几个周期函数,然后还要用到show函数,show函数可以return true和false,剩下的函数照着流程走,最后调用render函数。现在没有周期函数,相当于周期函数都通过了,现在state和props变化都会引起render函数的重绘
    在这里插入图片描述
    下面试试同步调用是什么样子的。
    定义state,下面render加一下东西

    在这里插入图片描述
    现在就有这么个值

    在这里插入图片描述
    这个数据如果是同步调用,要用this.setState,将ret塞进去,setState就变化了
    在这里插入图片描述
    这个函数最后必须return,现在是同步调用,只要函数不返回,另外一边就没办法返回
    在这里插入图片描述
    这里不支持time.sleep,所以写个for死循环,用个t.js测试看看
    在这里插入图片描述
    单独运行按F8

    在这里插入图片描述
    写一下死循环试试,这是用时间戳来做的
    在这里插入图片描述
    不用时间戳试试,现在就模拟出time.sleep了
    在这里插入图片描述
    现在是创建一个时间d,然后每次创建时间-创建的时间小于10秒
    在这里插入图片描述
    变量需要加let/var,这里是严格模式
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    点了之后,要等响应了才可以继续点页面,同步效果是整页刷新,里面函数不返回你就不能动,异步的调用是立即返回(返回不是最终的结果)在这里插入图片描述
    同步效果,只要不返回就一直等着,是不合适的
    在这里插入图片描述
    在这里插入图片描述
    response打印,点开就看到所有的值了,可以去提取里面的值
    在这里插入图片描述
    数据会封装在response 的data里,我们写的对象是一个token,一个user
    在这里插入图片描述
    出错的原因是没有做rewrite重写
    在这里插入图片描述
    看下官方
    在这里插入图片描述
    在这里插入图片描述
    替换重启一下即可
    在这里插入图片描述
    这时候点击onclick就会对service层login函数发起一个调用,如果login要联系后台服务器,这个时候可能会很消耗时间,如果是同步调用的,就会出现页面卡住直到后台返回,用户体验很差

    在这里插入图片描述
    我们就构建了一个service,提供给root,如果调用handle,使用死循环(来代表同步调用很耗时的话)整个页面就卡住了

    在这里插入图片描述
    所以用这种方式非常不好,如果时间太长,用户以为死机了,体验很糟糕
    在这里插入图片描述
    在这里插入图片描述
    所以我们用异步调用,有两种方案,
    一种是setTimeout(有问题,1.setTimeout写的函数不能传参;2.setinterval和setTimeout执行N秒后,执行,返回值拿不到,可以帮你延迟多少秒执行,也可以多少秒执行一次)
    所以这种方式可以用promise来解决

    在这里插入图片描述
    在handleclick函数里,调用service里的handle函数就立即返回
    在这里插入图片描述
    这个异步调用立马就返回了,promise,excutive里面两个参数

    在这里插入图片描述
    下面同步调用去掉
    在这里插入图片描述
    现在如果在页面里调用click,会调用service中的login,传入两个参数后,执行到这里立马promise
    在这里插入图片描述
    而promise对象一启动,立即执行异步操作,继续向下执行,promise不会卡在这里
    在这里插入图片描述
    返回中可以先返回

    在这里插入图片描述
    这就是在login中,这一句立马执行了,虽然拿到了,但是不是最终结果
    在这里插入图片描述
    没算好就不要这个值了,什么时候好了问promise,promise执行到所谓resolve就好了,什么时候执行完并不知道
    在这里插入图片描述
    这里return也不要了
    在这里插入图片描述
    state什么时候被修改,不修改就调用不来render,所以就在这里等,但是整个页面不卡死
    在这里插入图片描述
    resolve完了就要操作谁,直接this不行,因为是class userservice的实例
    在这里插入图片描述
    可以传一个this,this就是这个组件

    在这里插入图片描述
    有了这个组件,就可以通过第三个参数拿过来,就可以在内部使用obj变量
    在这里插入图片描述
    异步调用完成之后,就调用成功的回调函数,回调函数里已经拿到这个对象,通过这个对象修改它的state,而这个state修改之后会引起组件的render,这个组件就变化了
    在这里插入图片描述
    同步需要一直等着return,现在这家伙执行promise就立即return,这个return就是undefined,立即返回
    在这里插入图片描述
    这边onclick调用也就结束了在这里插入图片描述
    这边要等promise resolve或者reject了,才能调用相应的函数
    在这里插入图片描述
    提交就立即返回

    在这里插入图片描述
    等10秒,已经改变了,波浪线出来了
    在这里插入图片描述
    这就是异步调用方式,立即给你中间结果,要不要随你,我们不要,中间结果这里是return undefined,我们不需要。我们在等通知你改变,用react的修改state方式,就会调用render,页面就刷新了

    react最重要的就是state,props

    现在点击了还能点其他的,但是不管同步异步,时间不能太长

    在这里插入图片描述
    可以弄个遮罩层,图片加载,异步同步都需要等才能进去,只不过异步不让页面卡住效果更好
    在这里插入图片描述

    ajax也是异步提交,ajax请求发过去了,也是等数据回调之后才会解决问题,不管同步异步都需要将数据很快给用户显示
    在这里插入图片描述

    展开全文
  • 网络get/post请求异步同步请求回调

    千次阅读 2016-05-12 18:55:02
    网络回调,分为同步和异步,多数情况都会用异步,但是也有情况用到同步的。无论同步异步,都必须要在子线程中去加载。首先写一个写一个网络请求接口同步网络请求这里就说了,同步就是一直等待,等待他完成为止...

    教你怎么写网络异步同步请求回调

    最近需要用到请求网络数据,在网上一直查找,都找不到,要么是说的不明白,之后我自己动手来实现了。

    网络回调,分为同步和异步,多数情况都会用异步,但是也有情况用到同步的。

    无论同步异步,都必须要在子线程中去加载。

    首先写一个写一个网络请求接口。

    同步网络请求这里就说了,同步就是一直等待,等待他完成为止(有无结果)

    异步请求的回调才是我们要学习的重点

    比较有规范的通用回调接口

    class ResultCallback:
    public interface ResultCallback {
    
         void getReslt(String result);
    }
    

    请求网络的接口

    public class SongsProtocol extends BaseProtocol {
    public static void parse(String id, ResultCallback callback) {
        final RequestParams params = new RequestParams(HttpUrl.MUSICIANS_SONGS + id + "?type=yc|fc|bz&page="
                + SongsAdapter.page);
        resultCallback = callback;//实例化
    ------------------------------------------------------------------------
        x.http().get(params, new Callback.CommonCallback<String>() {
            Message message = new Message();
            @Override
            public void onSuccess(String result) {
                message.what = 0;
    
                message.obj = result;
                myHandler.sendMessage(message);
            }
    
            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                message.what = 1;
                myHandler.sendMessage(message);
                MyToast.show("加载错误,请稍后重试");
            }
            @Override
            public void onCancelled(Callback.CancelledException cex) {
                MyToast.show("加载取消,请稍后重试");
            }
            @Override
            public void onFinished() {
            }
        });
        //注意虚线之间的,我这里用xutils 3.0 这个是异步的,或者其他框架。当然你也可以用JAVA那个
    --------------------------------------------------------------------------
    }
    public  static Handler myHandler = new Handler() {
        @Override
        public void handleMessage(android.os.Message msg) {
    
            if (msg.what == 1) {
                resultCallback.getReslt("");
            } else if (msg.what == 0) {
                String result = (String) msg.obj;
                resultCallback.getReslt(result);
            }
        }
    
        ;
    };
    //声明抽象接口的变量
    static ResultCallback resultCallback = new ResultCallback() {
    
            @Override
            public void getReslt(String result) {
                // TODO Auto-generated method stub
            }
        };
    }
    

    在Activity中调用。

    声明 callback
    ResultCallback callback = new ResultCallback() {
        @Override
        public void getReslt(String result) {
            if (result.isEmpty()) {
                return;
            }
            Gson gson = new Gson();
            MusiciansSongs bean = gson.fromJson(result, MusiciansSongs.class);
            if ("200".equals(bean.getCode())) {
                datas = bean.getData().getList();
                if (bean.getData().getList().size() != 0) {
                    datas = bean.getData().getList();
                    SongsAdapter.page++;
                    LogUtils.e("songs protocol" + datas.toString());
    
                } else {
                    Toast.show("没有更多数据");
                }
    
            } else {
                Toast.show("请稍后重试");
            }
        }
    };
    //调用 
    SongsProtocol.parse(id, callback);
    

    速度非常快,毫无有延迟现象,这样子的难题又被解决了,当然这些代码还可以优雅一点,实现代码的复用。才是砸门追求的。

    很简单是吧,也没有要说声明,相信大家都可以看懂。

    展开全文
  • 本文的目的并不是介绍使用的什么技术,而是重点...这就是和异步相对的一个概念——同步。案例:A、张三打电话给李四,让李四帮忙写份材料。B、李四接到电话的时候,手上有自己的工作要处理,但他答应张三,忙完手...

    本文的目的并不是介绍使用的什么技术,而是重点阐述回调接口其实现原理。

    一、 异步和同步

    讲通俗点,异步就是不需要等当前执行的动作完成,就可以继续执行后面的动作。

    通常一个程序执行的顺序是:从上到下,依次执行。后面的动作必须等前面动作执行完成以后方可执行。这就是和异步相对的一个概念——同步。

    案例:

    A、张三打电话给李四,让李四帮忙写份材料。

    B、李四接到电话的时候,手上有自己的工作要处理,但他答应张三,忙完手上的工作后马上帮张三写好材料,并传真给张三。

    C、通完电话后,张三外出办事。

    说明:

    张三给李四通完电话后,就出去办事了,他并不需要等李四把材料写好才外出。那么张三让李四写材料的消息就属于异步消息。

    相反,如果张三必须等李四把材料写好才能外出办事的话,那么这个消息就属于同步消息了。

    二、 异步的实现

    传统的程序执行代码都是从上到下,一条一条执行的。

    但生活中有很多情况并不是这样,以上的案例中,如果李四需要几个小时以后才能帮张三写好材料的话,那张三就必须等几个小时,这样张三可能会崩溃或者抓狂。

    这种一条龙似的处理,显示不太合理。

    可以使用以下办法来处理这种问题:

    张三找王五去给李四打电话,等李四写好材料后,由王五转交给张三。这样张三就可以外出办其他的事情了。

    问题得到了合理的解决,之前张三一条线的工作,由张三和王五两条线来完成了,两边同时进行,彼此不耽误。

    三、 计算机语言的实现

    办法有了,如何用程序来模拟实现呢?

    A、以前由一个线程来处理的工作,可以通过新增一个线程来达到异步的目的。这也就是JAVA中的多线程技术。

    B、最后李四写好的材料必须交给张三,以做他用。这就是回调。

    回调你可以这样来理解:

    A发送消息给B,B处理好A要求的事情后,将结果返回给A,A再对B返回的结果来做进一步的处理。

    四、 Java代码的实现

    A、回调的实现

    1 /**

    2 * 回调接口3 *@author节奏4 *5 */

    6 public interfaceCallBack {7 /**

    8 * 执行回调方法9 *@paramobjects 将处理后的结果作为参数返回给回调方法10 */

    11 public voidexecute(Object... objects );12 }

    Java是面向对象的语言,因此回调函数就变成了回调接口。

    B、消息的发送者

    1 /**

    2 * 简单本地发送异步消息的类3 *@author节奏4 *5 */

    6 public class Local implementsCallBack,Runnable {7

    8 /**

    9 * 远程接收消息的类,模拟point-to-point10 */

    11 privateRemote remote;12

    13 /**

    14 * 发送出去的消息15 */

    16 privateString message;17

    18 publicLocal(Remote remote, String message) {19 super();20 this.remote =remote;21 this.message =message;22 }23

    24 /**

    25 * 发送消息26 */

    27 public voidsendMessage() {28 /**当前线程的名称**/

    29 System.out.println(Thread.currentThread().getName());30 /**创建一个新的线程发送消息**/

    31 Thread thread = new Thread(this);32 thread.start();33 /**当前线程继续执行**/

    34 System.out.println("Message has been sent by Local~!");35 }36

    37 /**

    38 * 发送消息后的回调函数39 */

    40 public voidexecute(Object... objects ) {41 /**打印返回的消息**/

    42 System.out.println(objects[0]);43 /**打印发送消息的线程名称**/

    44 System.out.println(Thread.currentThread().getName());45 /**中断发送消息的线程**/

    46 Thread.interrupted();47 }48

    49 public static voidmain(String[] args) {50 Local local = new Local(new Remote(), "Hello");51

    52 local.sendMessage();53 }54

    55 public voidrun() {56 remote.executeMessage(message, this);57

    58 }59 }

    C、远程消息的接收者

    1 /**

    2 * 处理消息的远程类3 *@author节奏4 *5 */

    6 public classRemote {7

    8 /**

    9 * 处理消息10 *@parammsg 接收的消息11 *@paramcallBack 回调函数处理类12 */

    13 public voidexecuteMessage(String msg,CallBack callBack) {14 /**模拟远程类正在处理其他事情,可能需要花费许多时间**/

    15 for(int i=0;i<1000000000;i++) {16

    17 }18 /**处理完其他事情,现在来处理消息**/

    19 System.out.println(msg);20 System.out.println("I hava executed the message by Local");21 /**执行回调**/

    22 callBack.execute(new String[]{"Nice to meet you~!"});23 }24

    25 }

    executeMessage()方法需要接收一个message参数,表示发送出去的消息; 而CallBack参数是他自己,也就是这里的this。表示发送消息后,由Local类自己来处理,调用自身的execute      方法来处理消息结果。

    如果这里不是用this,而是用其他的CallBack接口的实现类的话,那就不能称之为“回调”了,在OO的世界里,那就属于“委派”。也就是说:“回调”必须是消息的发送者来处理消息结果,否则不能称之为回调。这个概念必须明确。

    展开全文
  • 因为要写一个网络程序要用到UDP协议,UDP这东西...由于主界面底层是完全隔离只是通过中间的接口来通讯,导致线程总是不能正常的结束,程序结束后还有一个进程在那里不知道干什么. 于是翻阅MSDN,查找自己以前写的代码,最
  • 并发中的异步回调

    2020-12-26 19:25:52
    在多模块架构下,一个模块可能需要调用其他的多个模块,那么如何能做到异步的调用这些模块而且同步的处理这些接口的返回结果勒? 1.2 从一个具体的实例聊起 我们要烧一壶茶,需要怎么做? 需要清洗茶具 烧水 泡茶 ...

    并发基础中的Future异步回调模式

    1.1 问题?

    在多模块架构下,一个模块可能需要调用其他的多个模块,那么如何能做到异步的调用这些模块而且同步的处理这些接口的返回结果勒?

    1.2 从一个具体的实例聊起

    我们要烧一壶茶,需要怎么做?

    1. 需要清洗茶具
    2. 烧水
    3. 泡茶

    前两件事是可以同时进行的,等这两件事情做好了以后,才能干第三件事情。

    1.3 具体的实现方式

    1.3.1 join异步阻塞

    所谓的异步阻塞就是阻塞当前线程然后,直到准备合并的线程执行完毕。

    流程比较好理解,开启主线程,然后再开启清洗茶具和烧水的线程,接着使用join来阻塞主线程,等这两件事都完成后主线程才开始继续。

    1.3.2 FutureTask

    我们知道Runnable接口,我们可以实现这个接口,然后放到一个Thread中去。但是这个做法有个问题,就是它是无法给返回值的,要解决这个问题,我们可以用到Callable接口,但是为了能把这个接口放到Thread中去,就需要FutureTask这个类来作适配了,FutureTask间接继承了Runnable接口并持有Callable的属性,这样就很聪明的适配了。
    在我们理解了FutureTask后,代码也是很简单的,但是它的问题依然存在,那就是,它依然是阻塞的,在主线程上调用了FutureTask从Future哪里继承来的get方法后,就会阻塞。所以从这点看来,他与前面讲的join方法,没有什么本质区别。

    1.3.3 Netty的异步回调

    我们在netty中可以看到许多操作,如对通道的连接,写,读,都会返回一个ChannelFutre对象,我们可以对这个对象配置一个监听器,他是GenericFutureListener的继承者ChannelFutreListener的实现类。需要实现一个operationComplete的回调方法,说明操作完成后需要干什么事。 这才是一个正真的异步非阻塞的实现方式。

    展开全文
  • 这里的拦截器同时支持异步和同步两种模式,对于一些比较快的操作,可以直接使用同步拦截器。 <p><img alt="image" src=...
  • 文章目录创建子线程时,子线程是得不到父线程的 ThreadLocal,有什么办法可以解决这个问题?...为什么要使用多线程同步和异步有什么区别run()方法和start()方法有什么区别一个线程两次调用start...
  • 同步异步区别,接口异步调用如何实现怎么设置与使用 数据库 项目中mysql优化场景 除此之外,性能调优,还有什么方式 索引(b+树) 设计模式 单例模式有了解吗? 有哪些设计模式? 网络 httphttps区别,...
  • 第04节、怎么停止线程 第05节、ThreadLock原理剖析 第06节、总结 资料+源码.rar 0004-蚂蚁课堂(每特学院)-2期-java并发包&并发队列 第01节、Vector与ArrayList区别HasTable与HasMap线程安全源码分析 第02节、...
  • 大话Java多线程

    2021-03-05 10:37:25
    大话多线程来,让我们聊聊多线程基础知识线程与进程线程调度同步异步并发与并行Java创建线程1 继承Thread类2 实现Runnable接口3 实现Callable接口(*了解,用不多*)ThreadRunnable比较Thread的常用静态方法代码...
  • 多线程概念及多线程开启方式进程和线程什么时候开启多线程CPU的执行原理原理并发和并行同步和异步多线程和多进程的好处多线程的启动方式方式一:继承Thread类方式二:实现Runnable接口方式三: 实现Callable方式开启...
  • error和exception的区别xml的读取方法,各个方法特点什么是线程,怎么实现线程什么是序列化,怎么实现序列化同步和异步,分别实现数据库连接池的作用,怎么实现的jsp与servlet的区别挑选一个抽象类里的错误,包括...
  • 系列博客(一)中,讲述了如何使用 Spring 框架来实现事件收发机制,包含了实现接口和注解两种实现方式,以及包括了同步和异步两种运行方式。 在接下来的内容里,我们会介绍如何将事件的监听与事务进行关联。 2. ...
  • // 初始化时同步进行图片预加载 this.loadImgs(this.imgArr); } }, </code></pre> 绘制多图,其实就是循环遍历上面创建好的图片数组imgArr,然后对于每个图片对象,都调用this.ctx.drawImage...
  • 先花些时间唠叨下我做的《XX行业生产云》的...7、 “云”“端”之间需要数据同步异步),有什么比较好的数据同步方案或产品支持?ETL工具,如开源的Kettle?还是MQ产品,如支持MQTT协议的? 求大神赐教!
  • 还是先来看下使用的流程吧,okhttp一样分为异步和同步,其实Retrofit是对网络请求接口的封装,具体的网络请求是通过底层的Okhttp来实现的,所以后面的流程是一样的 先定义一个接口 public interface IRetrofitTest...
  • Answers

    2010-01-02 20:22:00
    a.数字电路 1)什么是setupholdup时间? 2)什么是竞争与冒险现象?...6)请画出微机接口电路中,典型的输入设备与微机逻辑示意图(数据接口,控制接口,锁存器/缓冲器). 7)你知道哪些常用逻辑电平?TTLCMOS...
  • 2007 年时做了几个传统游戏后开始研究快速动作游戏的同步问题,期间写过不少文章,算是国内比较早研究同步问题的人,然而发现不管怎么解决同步都需要在网络传输方面有所突破,后来离开游戏转行互联网后也发现不少...
  • 线程基础部分

    2021-02-21 19:45:00
    7.同步编程模型和异步编程模型二、线程的创建1.编写一个类,直接继承java.lang.Thread,重写run方法2.编写一个类,实现java.lang.Runnable接口实现run方法3.匿名内部类三、线程的生命周期及常用方法解析1.新建状态...
  • 服务管理:可以在前端脚本的形式,开发自定义web服务,实现与后端服务数据交互的能力。 数据中心:可以通过配置轻松实现数据透视图展示,数据统计、数据可视化图表开发等等功能。 智能办公:拥有语音办公、人脸...
  • 上几期讲了行程的五张状态,同步工具类,线程池等知识点?但是这些知识点在什么场景下使用呢? 使用多线程的场景:  场景一、定时向大量的用户发送邮件。... 场景三、你要写一个电商网站,怎么实现双11抢购模型。...
  • 怎么实现一个生产者连接池,不需要每次都是new一个生成者。 2、使用异步生成者方式进行测试,发现每次会发送多次数据到kafka,这个是怎么回事呢? 3、使用同步方式,把kafka生产者赋...
  • java面试宝典

    2013-02-28 16:04:01
    41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名...
  • 8、同步和异步怎么理解?分别在什么情况下使用。 26 9、java后台如何接收ajax数据? 26 10、为什么要有jquery? 26 11、jQuery选择器有多少种? 27 13、你是如何使用jquery中的ajax的? 27 14、jquery中的$.get和$....
  • 千方百计笔试题大全

    2011-11-30 21:58:33
    41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名...
  • java 面试题 总结

    2009-09-16 08:45:34
    16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,...
  • java基础题 很全面

    2009-05-09 09:24:24
    14. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 9 15. abstract class和interface有什么区别? 9 16. heap和stack有什么区别。 9 17. Static Nested Class 和 Inner Class的不同。 9 18. 什么时候用...

空空如也

空空如也

1 2 3 4 5 6
收藏数 107
精华内容 42
关键字:

同步接口和异步接口怎么实现