1。回调故事1.我最近辞职换了一份新工作。新公司的工作模式是前后端分离,但是现在的前端框架还是需要了解和熟悉的,之前的框架想扔掉。所以只好用原来的开发,但是原来的要造轮子,所以只能用js类库jQuery框架开发,然后jq中的ajax方法是用的最多的方法。之前写ajax的时候一直都是这样:$.ajax({url:"/xxxx",//requestedlinktype:"get",data:{},success:function(data){//执行业务逻辑},});所有的业务逻辑代码都放在success里面,然后发现经常用几个不同的$.ajax()方法来实现几乎相似的方法,导致success方法里面的业务逻辑非常混乱,整个代码的复用率不高。2.于是想到了封装ajax方法。ajax方法只是用来获取数据,不做其他事情,这样你拿到数据后就可以在数据上写自己的业务逻辑代码,不会引起业务逻辑。代码很乱。所以我们修改成这样的函数:functiongetData(arg){varreturnData,url=arg.url,type=arg.type,data=arg.sendData||{};varcontentType=arg.contentType||“应用程序/x-www-form-urlencoded”;$.ajax({url:url,type:type,data:JSON.stringify(data),contentType:contentType,async:false,dataType:"json",success:function(data2){returnData=data2;},});returnreturnData;}定义一个局部变量returnData来接受success返回的数据,由于ajax默认是异步的,需要改成同步的,这样returnData才能拿到数据,但是慢慢发现同步会阻塞执行下一个业务逻辑。如果网速太慢,接下来的代码将不会执行。这不是我需要获取数据的方法。于是想到了改进这个方法。3、之前看过jQuery源码,在ajax方法中传递参数。参数中包含一个函数叫success,不过success是将整个函数代码传入ajax方法,然后在后台返回数据给前端时调用:varsuccess=data.success;//data就是ajax调用的时候传入的参数if(xhr.readyState==4&&xhr.status==200){success(data);//这里调用}我只是想拍照葫芦画画是用回调来实现获取获取到的数据,这样就不会阻塞其他业务逻辑的进行,获取到数据后可以执行我想做的逻辑,所以改为:functiongetData(arg){varurl=arg.网址,类型=arg.type,数据=arg.sendData||{},返回数据=arg.returnData||function(){};//如果returnData未找到,将函数设置为空varcontentType=arg.contentType||“应用程序/x-www-form-urlencoded”;$.ajax({url:url,type:type,data:JSON.stringify(data),contentType:contentType,dataType:"json",success:function(data2){returnData(data2);//在这里运行函数},});}//调用函数getData({url:"/isleep/doctor",type:"post",sendData:{"doctor_id":doctorId,"record_id":recordId},contentType:"application/json",返回Data:showData,//传入回调函数});//设置回调函数varshowData=function(data){//业务逻辑代码}1.首先设置一个获取数据的函数,该函数传入一个参数,parameter是一个对象,类似于ajax,包括url等参数。2.调用getData函数,传入url等参数。returnData中showData代码直接作为参数传入getData函数,所以getData中的returnData是一个函数,指针指向showData,即将showData赋值给returnData。3、此时执行success时,会执行success函数中定义的returnData函数,returnData的执行相当于执行了showData函数。这样我们就可以获取到后台返回的数据,在showData中定义我们想要的业务逻辑,不管数据是怎么获取的,ajax同步会阻塞进程的情况。2.回调的解释百度百科是这样解释的:回调函数就是通过函数指针调用的函数。如果你把一个函数指针(地址)作为参数传递给另一个函数,当这个指针被用来调用它所指向的函数时,我们就说这是一个回调函数。回调函数不是由函数的实现者直接调用,而是在特定事件或条件发生时被另一方调用,用于响应事件或条件。大致意思就是回调通过函数通过参数定义的变量传递给另一个函数,在另一个函数中调用,我们称之为回调函数。callback的字面解释就是回调的意思。以上面为例,getData到达success函数时,会调用returnData(data)函数,但是会根据作用在链上的函数向上查找ajax方法中的定义,即定义会找到returnData,returnData只是参数赋值,传入的只是一个指针(地址),然后根据地址找到最顶层的showData函数,成功传入data参数,调用。js引擎在解释js的时候,js引擎会先初始化这个函数,也就是getData早就定义好了,但是直到成功了才调用,所以先定义,然后我们再调用。打回来。3.回调的意义回调是javascript最重要的特性,那么它的意义是什么呢?当我们想把类库封装起来,提供一个接口的时候,发现这个接口里面的每个人可能都有自己的业务逻辑。我们不能把这个接口写死。这是提供回调函数的更好方法,我们定义回调函数的参数,告诉用户可能有哪些参数,然后用户通过这个参数定义自己的业务员逻辑,这样就可以形成一个完整的函数体。这样写接口可以专注于写接口,不用考虑会出现的业务员逻辑,用户拿到接口后可以根据接口提供的数据自定义业务逻辑。
