В чем разница между API Fetch и XMLHttpRequest?
Я знаю, что fetch использует обещания, и оба они позволяют выполнять AJAX-запросы к серверу. Я читал, что fetch имеет некоторые дополнительные функции, которые недоступны в XMLHttpRequest (и в fetch polyfill, так как он основан на XHR).
Какими дополнительными возможностями обладает API fetch?
3 ответов:
Есть несколько вещей, которые вы можете сделать с fetch, а не с XHR:
- Вы можете использовать API кэша с объектами запроса и ответа;
- Вы можете выполнять запросы
no-cors, получая ответ от сервера, который не реализует CORS. Вы не можете получить доступ к телу ответа непосредственно из JavaScript, но вы можете использовать его с другими API (например, Cache API);- потоковые ответы (с XHR весь ответ буферизуется в памяти, с fetch вы сможете доступ к потоку низкого уровня). Это еще не доступно во всех браузерах, но скоро будет доступно.
Есть пара вещей, которые вы можете сделать с помощью XHR, которые вы пока не можете сделать с помощью fetch, но они будут доступны рано или поздно (читайте пункт "будущие улучшения" здесь: https://hacks.mozilla.org/2015/03/this-api-is-so-fetching/):
- прервать запрос (теперь это работает в Firefox и Edge, как объясняет @sideshowbarker в своем комментарии);
- отчет прогресс.
Эта статья https://jakearchibald.com/2015/thats-so-fetch/ содержит более подробное описание.
Fetch
- отсутствует встроенный метод для использования документов
- нет способа установить тайм-аут пока
- не удается переопределить заголовок ответа типа содержимого
- Если заголовок ответа content-length присутствует , но не представлен , общая длина тела неизвестна во время потоковой передачи
- вызовет обработчик прерывания сигнала даже , если запрос был завершен
XHR
- нет никакого способа не отправка файлов cookie (кроме использования нестандартного
mozAnonфлага или конструктораAnonXMLHttpRequest)- не удается вернуть
FormDataэкземпляры- не имеет эквивалента
fetch'Sno-corsmode- Всегда следуйте перенаправлениям
Ответы выше хороши и дают хорошие идеи, но я разделяю то же мнение, что и в этой записи в блоге разработчиков google, в том, что основное отличие (с практической точки зрения) заключается в удобстве встроенного обещания, возвращенного из
fetchВместо того, чтобы писать такой код
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();Мы можем навести порядок и написать что-нибудь более лаконичное и читабельное с обещаниями и современным синтаксисом
fetch('./api/some.json') .then((response) => { response.json().then((data) => { ... }); }) .catch((err) => { ... });
Comments