2016-09-02 62 views
4

使用此代碼:即使404也能解析?

fetch('notExists') // <---- notice 
    .then(
     function(response) 
     { 
      alert(response.status) 
     } 
    ) 
    .catch(function(err) 
    { 
     alert('Fetch Error : ', err); 
    }); 

這個承諾解決

mdn

它返回解析爲響應這一要求, 無論是成功與否的承諾。

即使轉到不存在的資源,解決失敗的ajax請求是不是很奇怪?

我的意思是 - 接下來呢?一個fetch到服務器已關閉,仍然得到解決的承諾?

我知道我可以在ok財產在response對象進行調查,但仍 -

問題

爲什麼取回被一個完全錯誤的請求(不存在的資源)得到解決。

BTW , jquery request , does get rejected

+3

它來解決,所以你可以處理的錯誤代碼。 – Barmar

+0

@Barmar那麼爲什麼不在捕獲/拒絕處理程序? –

+0

您是否期望獲取標準的作者回復?因爲他們會在沒有猜測的情況下回答這個問題。 –

回答

7

A fetch()只有當網絡請求本身由於某種原因失敗(主機未找到,沒有連接,服務器沒有響應等)時,呼叫才被拒絕。

從承諾的角度來看,從服務器返回的任何結果(404,500等)都被視爲成功的請求。從概念上講,您從服務器發出請求,服務器從網絡的角度回答您,請求成功完成。

然後,您需要測試該成功響應以查看是否有您想要的答案類型。如果你想404是拒絕,你可以說你自己的代碼:

fetch('notExists').then(function(response) { 
    if (response.status !== 200) { 
     // make the promise be rejected if we didn't get a 200 response 
     throw new Error("Not 200 response") 
    } else { 
     // go the desired response 
    } 
}).catch(function(err) { 
    // some error here 
}); 

你甚至可以製作自己的myFetch(),只是做這個自動爲您(任何非200響應狀態轉換爲拒絕)。

爲完全不好的 請求(非現有資源/服務器關閉)解決承諾背後的原因是什麼。

首先,服務器關閉不會產生成功的響應 - 將拒絕。

如果成功連接到服務器,發送請求並返回響應(任何響應),則會生成成功響應。至於「爲什麼」接口的設計者決定拒絕接受這一點,沒有與真正涉及該接口設計的人交談就說有點難,但對我來說似乎合乎邏輯。這種拒絕告訴你,請求是否通過並得到了有效的響應。由代碼決定如何處理響應。當然,您可以創建自己的包裝函數來修改該默認行爲。

+0

噢,我知道沒有地方可以比較,但'$ .ajax'到'// a'確實會被拒絕。 http://jsbin.com/pukurolego/1/edit?html,js輸出 –

+0

@RoyiNamir - 我不認爲你是jsbin的例子正在做你認爲的事情。如果我'console.log()'拒絕錯誤,我看到'無法加載資源:net :: ERR_ADDRESS_UNREACHABLE http:// 0.0.0.22 /'。我不知道jQuery的行爲,但你的jsbin沒有測試正確的東西。 – jfriend00

+0

你是對的,我的壞,沒有看到它。我需要休息 。 –

1

拒絕處理程序是用於網絡和CORS錯誤IIRC。如果請求到達服務器,並且它使用有效的http響應進行響應,則即使響應是代碼4xx或5xx,承諾也會得到滿足。

0

使用此代碼...

fetch(`https://fercarvo.github.io/apps/integradora/DB/corpus.json`) 
.then(async (data) => { 
    if (data.ok) { 
     data = await data.json() 
     //Here you have your data... 
    } 
}).catch(e => console.log('Connection error', e)) 
相關問題