一个 window.fetch(听过么?) 的兼容方案

window.fetch polyfill

The global fetch function is an easier way to make web requests and handle responses than using an XMLHttpRequest. This polyfill is written as closely as possible to the standard Fetch specification at https://fetch.spec.whatwg.org.

Installation

Available on Bower as fetch.

$ bower install fetch

You’ll also need a Promise polyfill for older browsers.

$ bower install es6-promise

This can be also be installed with npm.

$ npm install github/fetch --save

Using with npm and Browserify

require('es6-promise').polyfill();
require('fetch');

Note: if you install fetch with npm you won’t be able to specify a fuzzy version or range of versions for fetch in your package.json as npm does not support installing fuzzy versions from modules not published on their registry.

Instead, you can choose to install fetch at an exact specific version by changing package.json to:

"fetch": "https://github.com/github/fetch/archive/v0.1.0.tar.gz

Alternatively, if you would prefer to install fetch at a fuzzy version you can install it via bower to install it and use the debowerify transform.

Full worked examples of these two approaches to using fetch in Browserify are avalable:

Usage

The fetch function supports any HTTP method. We’ll focus on GET and POST example requests.

HTML

fetch('/users.html')
  .then(function(response) {
    return response.text()
  }).then(function(body) {
    document.body.innerHTML = body
  })

JSON

fetch('/users.json')
  .then(function(response) {
    return response.json()
  }).then(function(json) {
    console.log('parsed json', json)
  }).catch(function(ex) {
    console.log('parsing failed', ex)
  })

Response metadata

fetch('/users.json').then(function(response) {
  console.log(response.headers.get('Content-Type'))
  console.log(response.headers.get('Date'))
  console.log(response.status)
  console.log(response.statusText)
})

Post form

var form = document.querySelector('form')

fetch('/query', { method: 'post', body: new FormData(form) })

Post JSON

fetch('/users', {
  method: 'post',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'Hubot',
    login: 'hubot',
  })
})

File upload

var input = document.querySelector('input[type="file"]')

var form = new FormData() form.append('file', input.files[0]) form.append('user', 'hubot')

fetch('/avatars', { method: 'post', body: form })

Success and error handlers

This causes fetch to behave like jQuery’s $.ajax by rejecting the Promise on HTTP failure status codes like 404, 500, etc. The response Promise is resolved only on successful, 200 level, status codes.

function status(response) {
  if (response.status >= 200 && response.status < 300) {
    return Promise.resolve(response)
  } else {
    return Promise.reject(response)
  }
}

function json(response) {
  return response.json()
}

fetch('/users')
  .then(status)
  .then(json)
  .then(function(json) {
    console.log('request succeeded with json response', json)
  }).catch(function(response) {
    console.log('request failed with status', response.status)
  })

Browser Support

Chrome Latest ✔ | Firefox Latest ✔ | IE 10+ ✔ | Opera Latest ✔ | Safari 6.1+ ✔