Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用es6类扩展Axios_Javascript_Axios_Es6 Class - Fatal编程技术网

Javascript 使用es6类扩展Axios

Javascript 使用es6类扩展Axios,javascript,axios,es6-class,Javascript,Axios,Es6 Class,我对创建API包装器和使用es6类从axios扩展很感兴趣。这怎么可能?Axios有一个方法.create(),可用于生成新的Axios对象 class Api extends Axios { constructor(...args){ super(..args) this.defaults.baseURL = 'https://api.com' } cancelOrder (id) { return this.put(`/cancel/order/${id}

我对创建API包装器和使用es6类从axios扩展很感兴趣。这怎么可能?Axios有一个方法.create(),可用于生成新的Axios对象

class Api extends Axios {
  constructor(...args){
    super(..args)
    this.defaults.baseURL = 'https://api.com'
  }
  cancelOrder (id) {
    return this.put(`/cancel/order/${id}`)
  }
}
我知道我有权访问此
let instance=axios.create()

有什么想法吗

尝试1

import axios from 'axios'
const Axios = axios.create()

class Api extends Axios {
  constructor (...args) {
    super(...args)
    this.defaults.baseURL = 'https://api.com'
  }
  cancelOrder (id) {
    return this.put(`/cancel/order/${id}`)
  }
}

let api = new Api()

api.cancelOrder('hi')
  .then(console.log)
  .catch(console.log)
尝试2

import axios from 'axios'

class Axios {
  constructor () {
    return axios.create()
  }
}

class Api extends Axios {
  constructor () {
    super()
    this.defaults.baseURL = 'https://api.com'
  }
  cancelOrder (id) {
    return this.put(`/cancel/order/${id}`)
  }
}

let api = new Api()

console.log(api.__proto__)

api.cancelOrder('hi')
  .then(console.log)
  .catch(console.log)
如果你看一下,它们似乎没有公开Axios的“类”,只有一个实例

// Factory for creating new instances
axios.create = function create(defaultConfig) {
  return new Axios(defaultConfig);
};
我不相信实例对象可以在es6中扩展



您的第二次尝试似乎是最可行的,但是如果您想模拟每一个
axios
方法,您可能会有很多开销。

axios
当前没有导出它内部使用的
axios
对象

.create()
方法仅实例化一个新实例

// Factory for creating new instances
axios.create = function create(defaultConfig) {
  return new Axios(defaultConfig);
};
我创建了一个pr,用于导出
Axios

还有一个github问题:


您可以安装此软件包:
npm i axios-es6-class
我还想创建一个类,该类允许我创建具有预定义默认值的多个实例。这是我的解决办法

import axios from 'axios'

export class Axios {
    constructor() {
        return axios.create({
            baseURL: 'http://127.0.0.1:8080/',
            headers: {
                Authorization: 'AUTH TOKEN FROM INSTANCE',
                'Content-Type': 'application/json',
            },
        })
   }
}


我不确定这里的问题是什么?@Tuvia问题是我试图扩展Axios,但我不能:(你不能在es6中扩展
对象
。但是你可以扩展原型。但我不完全确定你想做什么。类(由es6定义)这是你必须做的
new MyClass
的事情。而
MyClass
是你可以扩展的东西,因此
阻抗失配开始。这将需要几十年的时间才能解决。这是非常恼人的,
Axios
无法扩展。我想扩展它,并添加一些我经常使用的通用方法e、 我想保留所有原始的axios方法,并将其全部放在我称之为“http”而不是“axios”的同一个实例上,但不幸的是,这种扩展似乎是不可能的,因为库开发人员认为他们知道得更好,所以他们不会让我们这样做。Facepalm。我想我有点困惑
。create()
/a甚至实现了“创建新实例的工厂”,以及为什么没有导出对Axios的访问。我不知道。只需查看代码的详细信息。如果您想公开实际的
Axios
“类”,您可以随时为guys项目提供叉子,并为此提供PR(同时使用叉子)好了。你有答案了@ThomasReggi:-)模块axios没有导出的成员“axios”。你使用的是哪个axios版本?“axios”:“0.21.0”
import axios, { Axios } from 'axios';

class Api extends Axios {
  constructor () {
    super()
    this.defaults.baseURL = 'https://api.com'
  }
  cancelOrder (id) {
    return this.put(`/cancel/order/${id}`)
  }
}