javascript - Fetch API vs XMLHttpRequest
Viem, že Fetch API používa Promises a oba vám umožňujú robiť AJAX požiadavky na server.
Čítal som, že Fetch API má niektoré doplnkové funkcie, ktoré nie sú dostupné v XMLHttpRequest (a ani v polyfille Fetch API, pretože je založený na XHR).
Aké ďalšie schopnosti má Fetch API?
Odpoveď č. 1
Existuje niekoľko vecí, ktoré môžete robiť s fetch a nie s XHR:
- Môžete použiť Cache API s objektmi požiadavky a odpovede;
- Môžete vykonávať požiadavky
no-cors, získavajúc odpoveď od servera, ktorý neimplementuje CORS. Nemôžete priamo pristupovať k telu odpovede z JavaScriptu, ale môžete ho použiť s inými API (napr. Cache API); - Streamovanie odpovedí (s XHR je celá odpoveď uložená v pamäti, s fetch budete môcť pristupovať k nízkoúrovňovému streamu). Toto ešte nie je dostupné vo všetkých prehliadačoch, ale čoskoro bude.
Existuje niekoľko vecí, ktoré môžete robiť s XHR a ktoré zatiaľ nemôžete robiť s fetch, ale čoskoro budú k dispozícii (prečítajte si odsek „Budúce vylepšenia“ tu: https://hacks.mozilla.org/2015/03/this-api-is-so-fetching/):
- Zrušiť požiadavku (toto teraz funguje vo Firefoxe a Edge, ako @sideshowbarker vysvetľuje vo svojom komentári);
- Ohláste pokrok.
Tento článok https://jakearchibald.com/2015/thats-so-fetch/ obsahuje podrobnejší opis.
Odpoveď #2
priniesť
- chýba vstavaná metóda na spracovanie dokumentov
- ešte neexistuje spôsob, ako nastaviť časový limit
- nie je možné prepísať hlavičku odpovede content-type
- ak je hlavička odpovede content-length prítomná ale nie je zverejnená, celková dĺžka tela je počas streamovania neznáma
- bude volať obslužnú rutinu prerušenia signálu aj, ak bola požiadavka dokončená
- žiadny postup nahrávania (podpora pre
ReadableStreaminštancie ako telá požiadaviek ešte nie je k dispozícii) - nepodporuje
--allow-file-access-from-files(chromium)
XHR
- neexistuje spôsob, ako neodoslať cookies (okrem použitia nestandardného parametra
mozAnonalebo konštruktoraAnonXMLHttpRequest) - nemôže vrátiť inštancie
FormData - nemá ekvivalent k režimu
no-corsvfetch - vždy nasleduje presmerovania
Odpoveď č. 3
Odpovede vyššie sú dobré a poskytujú dobrý pohľad, ale zdieľam rovnaký názor, ako je uvedené v tomto blogovom príspevku pre vývojárov Google, že hlavný rozdiel (z praktického hľadiska) je pohodlie vstavaného sľubu, ktorý vracia fetch
Namiesto toho, aby ste museli písať kód takto
function reqListener() {
var data = JSON.parse(this.responseText);
}
function reqError(err) { ... }
var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.onerror = reqError;
oReq.open('get', './api/some.json', true);
oReq.send();
môžeme veci vyčistiť a napísať niečo trochu stručnejšie a čitateľnejšie pomocou sľubov a modernej syntaxe
fetch('./api/some.json')
.then((response) => {
response.json().then((data) => {
...
});
})
.catch((err) => { ... });
