摘要:回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對該事件或條件進(jìn)行響應(yīng)。大體意思就是回調(diào)是通過函數(shù)定義的變量通過參數(shù)傳入另一個函數(shù),在另一個函數(shù)進(jìn)行調(diào)用,我們就稱之為回調(diào)函數(shù)。
1.回調(diào)的故事
1.最近辭職換了新工作,新公司的工作模式是前后端分離的,但是目前前端框架還需要了解以及熟悉,之前的框架又想廢棄,于是不得不用原生來開發(fā),但是原生得造輪子啊,于是只能用js的類庫jQuery框架來進(jìn)行開發(fā),然后jq中ajax方法是用的最多的方法。
之前寫ajax一直是這樣:
$.ajax({ url : "/xxxx",//請求的鏈接 type : "get", data : {}, success : function(data){ //執(zhí)行業(yè)務(wù)邏輯 }, });
所有的業(yè)務(wù)邏輯代碼都放在success里面,然后就發(fā)現(xiàn)經(jīng)常得開幾個不同的$.ajax()方法實(shí)現(xiàn)幾乎相似的方法,導(dǎo)致sucess方法里面業(yè)務(wù)邏輯非常混亂,并且整個代碼的復(fù)用率并不高。
2.于是就想著封裝ajax方法,ajax方法僅僅只是用來獲取數(shù)據(jù)而不做其他層次的事情,這樣就可以在拿到數(shù)據(jù)后對數(shù)據(jù)寫自己的業(yè)務(wù)邏輯代碼了,而不會導(dǎo)致業(yè)務(wù)邏輯代碼混亂。于是我們就改裝成這樣的函數(shù):
function getData(arg){ var returnData, url = arg.url, type = arg.type, data = arg.sendData || {}; var contentType = arg.contentType || "application/x-www-form-urlencoded"; $.ajax({ url : url, type : type, data : JSON.stringify(data), contentType : contentType, async: false, dataType : "json", success : function(data2){ returnData = data2; }, }); return returnData; }
定義一個局部變量returnData來接受success返回的數(shù)據(jù),并且由于ajax默認(rèn)是異步的,需要給改成同步的,這樣returnData才能獲取到數(shù)據(jù),但是漸漸發(fā)現(xiàn)同步會阻塞接下來業(yè)務(wù)邏輯的執(zhí)行,如果網(wǎng)速過慢的話會導(dǎo)致接下來代碼都無法執(zhí)行,這不是我所需要的獲取數(shù)據(jù)的方法。于是就又想著改進(jìn)這個方法。
3.之前看過jQuery源碼,ajax方法里傳入?yún)?shù),其中參數(shù)包括一個函數(shù)叫success,但是success是把整個函數(shù)代碼傳入ajax方法里的,然后在后臺返回?cái)?shù)據(jù)到前端時(shí)進(jìn)行調(diào)用:
var success = data.success;//data是ajax進(jìn)行調(diào)用時(shí)傳入的參數(shù) if(xhr.readyState==4 && xhr.status==200){ success(data);//這兒進(jìn)行調(diào)用 }
我就想著照葫蘆畫瓢來用回調(diào)來獲取得到的數(shù)據(jù),這樣就可以又不會阻塞其他業(yè)務(wù)邏輯的進(jìn)行,又可以在數(shù)據(jù)獲取到之后執(zhí)行我想做的邏輯,于是就給改成:
function getData(arg){ var url = arg.url, type = arg.type, data = arg.sendData || {}, returnData = arg.returnData || function(){};//如果returnData為underfind時(shí)設(shè)置函數(shù)為空 var contentType = arg.contentType || "application/x-www-form-urlencoded"; $.ajax({ url : url, type : type, data : JSON.stringify(data), contentType : contentType, dataType : "json", success : function(data2){ returnData(data2);//這兒運(yùn)行函數(shù) }, }); } //調(diào)用獲取數(shù)據(jù)的函數(shù) getData({ url : "/isleep/doctor", type : "post", sendData : {"doctor_id" : doctorId,"record_id" : recordId}, contentType : "application/json", returnData : showData, //傳入的回調(diào)函數(shù) }); //設(shè)置回調(diào)函數(shù) var showData = function(data){ //業(yè)務(wù)邏輯代碼 }
1.先設(shè)置一個獲取數(shù)據(jù)的函數(shù),函數(shù)傳入一個參數(shù),參數(shù)是一個對象,跟ajax差不多,其中包括url等參數(shù)。
2.調(diào)用getData函數(shù),傳入url等參數(shù),在returnData是直接把showData代碼作為參數(shù)傳入到getData函數(shù)里面去的,這樣在getData里returnData就是一個函數(shù)了,指針指向showData,即把showData賦值給returnData。
3.這時(shí)當(dāng)success執(zhí)行后,就會執(zhí)行success函數(shù)里面定義的returnData函數(shù),而returnData執(zhí)行即相當(dāng)于執(zhí)行showData函數(shù)。
這樣我們就可以拿到后臺返回的數(shù)據(jù),在showData里面定義我們自己想要的業(yè)務(wù)邏輯,而不去管怎么獲取數(shù)據(jù),以及ajax同步會阻塞進(jìn)程的情況了。
2.回調(diào)的解釋百度百科是這樣解釋的:
回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對該事件或條件進(jìn)行響應(yīng)。
大體意思就是回調(diào)是通過函數(shù)定義的變量通過參數(shù)傳入另一個函數(shù),在另一個函數(shù)進(jìn)行調(diào)用,我們就稱之為回調(diào)函數(shù)。
而回調(diào)字面解釋意思就是回頭去調(diào)用,以上面為例,當(dāng)getData進(jìn)行到success函數(shù)時(shí),會調(diào)用returnData(data)函數(shù),但ajax方法里面為定義,根據(jù)函數(shù)作用于鏈會向上找,即找到定義returnData的地方,而returnData是只是通過參數(shù)賦值的,傳進(jìn)來的只是一個指針(地址),再根據(jù)地址去找到最上層的showData函數(shù),在success里面?zhèn)魅雂ata參數(shù),并調(diào)用。而js引擎在解釋js時(shí),js引擎會首先初始化函數(shù),即getData是早就定義好的,但一直沒有進(jìn)行調(diào)用,直到進(jìn)行到success時(shí)才進(jìn)行調(diào)用,所以先定義好,再調(diào)用我們稱之為回調(diào)。
回調(diào)作為javascript最重要的一個特性,那么他的意義何在呢?當(dāng)我們想封裝類庫并且提供接口時(shí),我們發(fā)現(xiàn)這個接口每個人都有可能有自己的業(yè)務(wù)邏輯,我們不能把這個接口給寫死,這是提供一個回調(diào)函數(shù)不得不說是一個更棒的辦法,我們把回調(diào)函數(shù)的參數(shù)定義好,告訴用戶有可能會有哪幾個參數(shù),然后用戶拿這個參數(shù)去定義自己的業(yè)務(wù)員邏輯,這樣就可以構(gòu)成一個完成的函數(shù)體了。
這樣寫接口就可以專注于寫接口而不會去考慮會發(fā)生的業(yè)務(wù)員邏輯情況,而用戶拿到接口就可以根據(jù)接口提供的數(shù)據(jù)來自定義業(yè)務(wù)邏輯了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90976.html
摘要:第二篇仿寫生態(tài)系列模板小故事本次任務(wù)承上完成第一篇未完成的熱更新配置核心完成模板解析模塊的相關(guān)編寫很多文章對模板的解析闡述的都太淺了本次我們一起來深入討論一下盡可能多的識別用戶的語句啟下在結(jié)構(gòu)上為雙向綁定等模塊的編寫打基礎(chǔ)最終效果圖一模板頁 ( 第二篇 )仿寫Vue生態(tài)系列___模板小故事. 本次任務(wù) 承上: 完成第一篇未完成的熱更新配置. 核心: 完成模板解析模塊的相關(guān)編寫, ...
摘要:第二篇仿寫生態(tài)系列模板小故事本次任務(wù)承上完成第一篇未完成的熱更新配置核心完成模板解析模塊的相關(guān)編寫很多文章對模板的解析闡述的都太淺了本次我們一起來深入討論一下盡可能多的識別用戶的語句啟下在結(jié)構(gòu)上為雙向綁定等模塊的編寫打基礎(chǔ)最終效果圖一模板頁 ( 第二篇 )仿寫Vue生態(tài)系列___模板小故事. 本次任務(wù) 承上: 完成第一篇未完成的熱更新配置. 核心: 完成模板解析模塊的相關(guān)編寫, ...
閱讀 1437·2021-11-25 09:43
閱讀 2580·2021-09-24 10:30
閱讀 3659·2021-09-06 15:02
閱讀 3593·2019-08-30 15:55
閱讀 3300·2019-08-30 15:53
閱讀 1693·2019-08-30 15:52
閱讀 2142·2019-08-30 14:21
閱讀 2010·2019-08-30 13:55