api.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import axios from 'axios'
  2. export class AjaxError extends Error {
  3. code = 0
  4. constructor (msg, code) {
  5. super(msg || '未知错误')
  6. this.code = code
  7. }
  8. }
  9. const CancelToken = axios.CancelToken
  10. const link = document.createElement('a')
  11. // const RESPONSE_ERROR = 'ResponseError'
  12. const REQUEST_CANCEL = 'RequestCancel'
  13. const request = axios.create({
  14. baseURL: process.env.API_BASE_PATH,
  15. timeout: 300000
  16. })
  17. request.interceptors.request.use(config => {
  18. return config
  19. }, error => new Promise((resolve, reject) => reject(error)))
  20. request.interceptors.response.use(response => new Promise((resolve, reject) => {
  21. const { config, data } = response
  22. if (/^(blob)$/i.test(config.responseType)) {
  23. if (data instanceof Blob) {
  24. const match = /filename=([^;]+)/.exec(response.headers['content-disposition'])
  25. if (match) {
  26. let filename = decodeURIComponent(match).split(',')
  27. link.href = URL.createObjectURL(data)
  28. link.download = filename ? filename[filename.length - 1] : ''
  29. link.click()
  30. URL.revokeObjectURL(link.href)
  31. }
  32. return resolve(response)
  33. }
  34. return resolve(data)
  35. }
  36. if (typeof data !== 'object' || data === null) {
  37. return reject(new AjaxError('数据格式不正确', 30000))
  38. }
  39. const { type } = data
  40. if (type === 'success') {
  41. return resolve(data.data)
  42. }
  43. return reject(new AjaxError(data.msg, 500))
  44. }), error => {
  45. if (error.message === REQUEST_CANCEL) {
  46. return
  47. }
  48. if (!(error instanceof AjaxError)) {
  49. error = new AjaxError('服务器正忙', 500)
  50. }
  51. return Promise.reject(error)
  52. })
  53. export const api = (config) => {
  54. const source = CancelToken.source()
  55. config = Object.assign({ cancelToken: source.token }, config)
  56. const promise = request(config)
  57. promise.abort = () => source.cancel(REQUEST_CANCEL)
  58. return promise
  59. }