js異步之callback簡述

js及nodejs由于其單線程特性,對于應(yīng)用中比較耗時(shí)的網(wǎng)絡(luò)請求逮京、磁盤操作均已異步形式完成缘眶。因此嘱根,經(jīng)常看到如下形式

getLocation(res){
   if(res.ok){
     login(res){
        if(res.ok){
          setState() 
      }
    }
  }
}

getLocation成功后才能執(zhí)行l(wèi)ogin操作巷懈,login成功后才能setState更新數(shù)據(jù)
如果中間還要添加會阻塞當(dāng)前應(yīng)用進(jìn)程的操作该抒,且其數(shù)據(jù)依賴于上一部操作成功返回的結(jié)構(gòu),就需要寫在上一步的成功回調(diào)下顶燕,這樣嵌套層級越來越多凑保,就會陷入所謂的“回調(diào)地獄”。對于此類問題的解決涌攻,有es6的promise和es7的async/await欧引,這里,我們不研究深層次的回調(diào)問題恳谎,只討論當(dāng)遇到這種情況時(shí)维咸,如何將其封裝成一個模塊達(dá)到重復(fù)利用。

以常用的fetch為例

export default function _update(url, data, callback){
  let init = {
    credentials: 'include',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    mode: 'cors',
    body: JSON.stringify(data)
  }

  fetch(url, init)
    .then(res => res.json())
    .then(res => {
      // fetch請求得到相應(yīng)惠爽,根據(jù)回傳的res執(zhí)行下一步操作
      callback(res)
    })
}

_update為封裝的一個通用fetch模塊,接受請求url瞬哼,請求時(shí)發(fā)送給服務(wù)端的數(shù)據(jù)婚肆,以及請求成功時(shí)需要執(zhí)行的回調(diào)函數(shù)三個參數(shù)。callback的傳遞保證fetch在服務(wù)端有數(shù)據(jù)返回后調(diào)用坐慰,因此较性,可以像如下形式使用這個模塊用僧。

import update from 'update.js'

update('https://xxx', {
  name: 'xm',
  age: 12
}, res => {
  console.log(res)
})

傳遞給update三個參數(shù),對應(yīng)于模塊中的形參赞咙。
調(diào)用函數(shù)中第三個函數(shù)參數(shù)

res => {
  console.log(res)
}

對應(yīng)于模塊中的callback(res)责循,相當(dāng)于

function callback(res){
  console.log(res)
}

如果在update前先要獲取到當(dāng)前位置

function getLocation(callback){
  ......
  if(res){
    callback(url)
  }
}

如果獲取位置成功,將位置信息res傳遞給update函數(shù)攀操,update在fetch請求得到相應(yīng)后刷新數(shù)據(jù)院仿,那么將getLocation改造成如下即可

function getLocation(callback){
  ......
  if(res){
    callback('https://xxx', {
      location: res
    }, res => {
      cosole.log(res)
    })
  }
}

兩個res,一個是獲取到位置回傳的res速和,另一個是fetch請求相應(yīng)回傳的res
調(diào)用只需要一行代碼

getLocation(update)

可以將update的三個參數(shù)傳遞給getLocation歹垫,達(dá)到更大的復(fù)用性。但這樣一來颠放,代碼脈絡(luò)不夠清晰排惨,顯得有些累贅了。
建議只有一層回調(diào)時(shí)使用這種封裝方法碰凶,如果對方法有更好的設(shè)計(jì)暮芭,多層回調(diào)時(shí)也不妨一試。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欲低,一起剝皮案震驚了整個濱河市辕宏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伸头,老刑警劉巖匾效,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恤磷,居然都是意外死亡面哼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門扫步,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魔策,“玉大人,你說我怎么就攤上這事河胎〈程唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵游岳,是天一觀的道長政敢。 經(jīng)常有香客問我,道長胚迫,這世上最難降的妖魔是什么喷户? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮访锻,結(jié)果婚禮上褪尝,老公的妹妹穿的比我還像新娘闹获。我一直安慰自己,他們只是感情好河哑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布避诽。 她就那樣靜靜地躺著,像睡著了一般璃谨。 火紅的嫁衣襯著肌膚如雪沙庐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天睬罗,我揣著相機(jī)與錄音轨功,去河邊找鬼。 笑死容达,一個胖子當(dāng)著我的面吹牛古涧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播花盐,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼羡滑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了算芯?” 一聲冷哼從身側(cè)響起柒昏,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熙揍,沒想到半個月后职祷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡届囚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年有梆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片意系。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡泥耀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛔添,到底是詐尸還是另有隱情痰催,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布迎瞧,位于F島的核電站夸溶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凶硅。R本人自食惡果不足惜蜘醋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咏尝。 院中可真熱鬧压语,春花似錦、人聲如沸编检。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允懂。三九已至厕怜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蕾总,已是汗流浹背粥航。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留生百,地道東北人递雀。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蚀浆,于是被迫代替她去往敵國和親缀程。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容