情景描述
- 使用fetch發(fā)送請求
- 服務器發(fā)現(xiàn)無法處理默穴,因此對請求進行了重定向處理。返回狀態(tài)碼302褪秀,并且在請求頭中賦予了Location令其跳轉(zhuǎn)到location的value中蓄诽。
- 但是location對應的服務器不接受跨域請求,因此拿不到數(shù)據(jù)
- 所以我們嘗試在fetch的回調(diào)函數(shù)中去處理媒吗,一旦fetch的response是302的時候做跳轉(zhuǎn)頁面
- 但是不論在fetch的回調(diào)函數(shù)中做任何事情仑氛,都沒有用,似乎永遠執(zhí)行不到蝴猪。
矛盾點
- fetch發(fā)送的請求调衰,response回來膊爪,本來都能觸發(fā)fetch的回調(diào)函數(shù)then的執(zhí)行,為什么這時候不會執(zhí)行了呢嚎莉?
解決
Q1:301和302都是重定向米酬,他們之間有什么區(qū)別呢?
-
A1:區(qū)別在于永久重定向和臨時重定向趋箩。
- 301:永久重定向赃额。一旦請求發(fā)往某個URL,狀態(tài)碼返回301叫确,那么瀏覽器就會自動跳轉(zhuǎn)到header中Location對應的url跳芳。下次請求,再次向location對應的uri發(fā)送請求
- 以后每次請求都會跳轉(zhuǎn)到location對應的uri中竹勉。沒有例外
- 并且瀏覽器可以緩存從這個uri獲取到的到的響應飞盆。
- 302:臨時重定向。請求的資源臨時從不同的uri獲取次乓。一旦請求發(fā)往某個URL吓歇,狀態(tài)碼返回302,那么瀏覽器就會自動跳轉(zhuǎn)到header中Location對應的url票腰。但是下次再次請求的時候向原來的uri發(fā)請求城看。
- 每次請求是否向Location對的uri發(fā)請求不確定,因此需要先想原來的uri發(fā)送請求確定杏慰。
- 瀏覽器不可緩存從重定向的uri獲取到的響應
- 301:永久重定向赃额。一旦請求發(fā)往某個URL,狀態(tài)碼返回301叫确,那么瀏覽器就會自動跳轉(zhuǎn)到header中Location對應的url跳芳。下次請求,再次向location對應的uri發(fā)送請求
Q2:fetch獲得302的response他的那么一種回調(diào)函數(shù)會被執(zhí)行测柠?(catch,then)
A2:經(jīng)過試驗fetch的catch回調(diào)函數(shù)會被調(diào)用缘滥,并且catch的參數(shù)是error僅僅只是fail to fetch轰胁。并且無法獲取任何有關response的信息。
-
Q3:那么重定向的過程是如何進行的呢完域?
- fetch發(fā)送請求瀏覽器獲取response status是302
- 瀏覽器會檢查請求頭中是否包含瀏覽器在發(fā)現(xiàn)Location的header時就會自動跳轉(zhuǎn)到Location所指定的URL地址软吐。
- 然后瀏覽器直接請求Location指定的地址。此時fetch并不知情吟税,他以為請求還在處理過程中凹耙。
-
---- 然而我們的實際情況
- Location所指定的URL是一個跨域請求,但是對應的服務器無法處理跨域請求肠仪。因此跨域response返回給瀏覽器肖抱。
- 瀏覽器再將結果返回給fetch。
- 對于這種跨域失敗的請求异旧,fetch自動觸發(fā)了catch回調(diào)函數(shù)意述,并且給出error,fail to fetch
結論:對于重定向,當瀏覽器檢查到headers中存在Location荤崇,會直接進行跳轉(zhuǎn)拌屏,不會告知任何請求發(fā)送者(fetch)這時候發(fā)送者會以為請求還在處理中。
- Q4:fetch不是只有服務器錯誤才會導致catch的觸發(fā)术荤,其他都會觸發(fā)then函數(shù)倚喂,那么302為什么會觸發(fā)then?
- A4:根據(jù)上面的分析可知瓣戚,并不是302導致catch被觸發(fā)而是重定向后的請求的response導致catch被調(diào)用端圈。
反思
- 本以為由于302所以導致fetch的catch被調(diào)用,我一直想知道什么樣的狀態(tài)碼會導致fetch catch調(diào)用子库,什么樣狀態(tài)碼導致fetch’的then調(diào)用舱权。本來想就直接在筆記本上記上。卻沒想到真正的原因是別的仑嗅。
- 這是以前的學習一直有的毛病宴倍,聽到老師講的概念或者看到某個表象,猜測以后直接下定論仓技,然后記下來當成概念背下來啊楚,自己都沒有想過原理
ACTION
- 還是一樣,每個問題一個筆記浑彰,只有通過筆記理清楚問題發(fā)生的原因結果,才會避免死記硬背拯辙,還能靈活的運用概念郭变。