使用axios在request攔截器中取消請求

最近在工作中遇到這樣的需求夺蛇,新用戶在第一次登錄的時候需要強制修改密碼步做。剛開始接到這個需求的時候副渴,心里想著在axios的請求攔截器中統(tǒng)一處理就可以了,判斷用戶是否需要修改密碼全度,如果需要修改密碼就返回一個reject煮剧,從而不發(fā)送請求。好像很簡單啊将鸵,說干就干勉盅。
首先照著上面的想法,擼出下列代碼:

http.interceptors.request.use(config => {
  if (needChangePassword) {
    return Promise.reject(new Error('changePassword'))
  } else {
    config.cancelToken = store.source.token
    return config
  }
}, err => {
  return Promise.reject(err)
})

心里想著顶掉,如果需要修改密碼草娜,就調(diào)用reject,然后在每個發(fā)送請求的外面都會有catch異常痒筒,在catch中統(tǒng)一處理錯誤信息宰闰,so beautiful茬贵,保存->運行,唉唉唉移袍,怎么reject之后跑到外面的then里面去了解藻,不是應該跳catch嗎?有毒啊咐容。
各種debugger之后舆逃,發(fā)現(xiàn)無論怎么reject,就是不跳catch戳粒。在走投無路之下路狮,只能求助源碼了,最后在源碼core->Axios.js中發(fā)現(xiàn)了promise的調(diào)用順序蔚约,主要源碼如下:

  var chain = [dispatchRequest, undefined];
  var promise = Promise.resolve(config);

  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
    chain.unshift(interceptor.fulfilled, interceptor.rejected);
  });

  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    chain.push(interceptor.fulfilled, interceptor.rejected);
  });

  while (chain.length) {
    promise = promise.then(chain.shift(), chain.shift());
  }

看完之后奄妨,才不得不感嘆下,大牛果然就是不一樣苹祟。源碼的大致意思是這樣的砸抛,首先處理request攔截器相關的promise,然后再發(fā)送請求树枫,然后再處理respose攔截器相關promise直焙,通過一個while循環(huán)生成了一個promsie鏈,最后返回的promise相當于下面:

promise = promise.then(request.fuifilled1, request.reject1)
.then(request.fuifilled2, request.reject)...
.then(dispatchRequest, undefined)
.then(response.fuifilled1, response.reject1)
.then(response.fuifilled2, response.reject2)...
.then(response.fuifilledn, response.rejectn)

這個chain真是用的好砂轻,又學習到了奔誓。最后回到上面的問題,應該就很簡單了搔涝,在request的fuifilled中reject厨喂,然后到undefined,然后到response中的reject庄呈。由于最開始沒有在response的reject處理changePassword的錯誤蜕煌,并且沒有在reject中始終返回reject,所有就跑到外面的then里面诬留,而沒有跳到catch中斜纪。
最后附上修改后的代碼:

http.interceptors.request.use(config => {
  if (needChangePassword) {
    return Promise.reject(new Error('changePassword'))
  } else {
    config.cancelToken = store.source.token
    return config
  }
}, err => {
  return Promise.reject(err)
})
// 配置攔截器與錯誤處理
http.interceptors.response.use(function (response) {
  const code = _.get(response, 'data.code')
  if (code !== 10000) {
    if (code === 10008) {
      window.location.href = '/'
    } else {
      isDev && console.error(response, '請求返回狀態(tài)碼不為10000')
      throw new Error(response.data.message)
    }
  } else {
    return response.data.data ? response.data.data : response.data
  }
}, function (error) {
  if (axios.isCancel(error)) {
    throw new Error('cancelled')
  } else if (error.message === 'changePassword') {
    throw new Error('changePassword')
  } else {
    if (error.response) {
      if (isDev) {
        console.group('請求發(fā)生錯誤')
        console.log(error.response.data)
        console.log(error.response.status)
        console.log(error.response.headers)
        console.groupEnd()
      }
      throw new Error('接口異常, 請聯(lián)系管理員')
    }
  }
})

最后感嘆下,源碼還是個好東西文兑,既能加深理解盒刚,又能學習知識。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彩届,一起剝皮案震驚了整個濱河市伪冰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌樟蠕,老刑警劉巖贮聂,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靠柑,死亡現(xiàn)場離奇詭異,居然都是意外死亡吓懈,警方通過查閱死者的電腦和手機歼冰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耻警,“玉大人隔嫡,你說我怎么就攤上這事「蚀” “怎么了腮恩?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長温兼。 經(jīng)常有香客問我秸滴,道長,這世上最難降的妖魔是什么募判? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任荡含,我火速辦了婚禮,結果婚禮上届垫,老公的妹妹穿的比我還像新娘释液。我一直安慰自己,他們只是感情好装处,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布误债。 她就那樣靜靜地躺著,像睡著了一般符衔。 火紅的嫁衣襯著肌膚如雪找前。 梳的紋絲不亂的頭發(fā)上糟袁,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天判族,我揣著相機與錄音,去河邊找鬼项戴。 笑死形帮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的周叮。 我是一名探鬼主播辩撑,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仿耽!你這毒婦竟也來了合冀?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤项贺,失蹤者是張志新(化名)和其女友劉穎君躺,沒想到半個月后峭判,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡棕叫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年林螃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺泣。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡疗认,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伏钠,到底是詐尸還是另有隱情横漏,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布熟掂,位于F島的核電站绊茧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏打掘。R本人自食惡果不足惜华畏,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尊蚁。 院中可真熱鬧亡笑,春花似錦、人聲如沸横朋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琴锭。三九已至晰甚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間决帖,已是汗流浹背厕九。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留地回,地道東北人扁远。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像刻像,于是被迫代替她去往敵國和親畅买。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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