如何获取方法的名称(@action)?

时间:2019-01-26 14:18:00

标签: mobx mobx-react

class UserStore {
  @observable rules = {
      data:[],
      isFeatching: false,
      error:false,
  };
    @observable rooms = {
      data:[],
      isFeatching: false,
      error:false,
  };
    @observable money = {
      data:[],
      isFeatching: false,
      error:false,
  };

  @action
  async getRules() {
    try {
       this.rules.isFeatching = true;
       const data = await api.getRules();
       this.rules.isFeatching = false;
    }
  }

  @action
  async getRooms() {
    try {
       this.rooms.isFeatching = true;
       const data = await api.getRooms();
       this.rooms.isFeatching = false;
    }
  }

  @action
  async getMoney() {
    try {
       this.money.isFeatching = true;
       const data = await api.getMoney();
       this.money.isFeatching = false;
    }
  }

} 

请帮助我。

问题的条件: 1)我需要在一个商店中获取三种类型的数据。

任务目标: 1)如何使其自动放置“ isFeatching”? 有什么办法可以自动化?

我有以下想法: 创建一个全局数组(或将从中继承的类):

const globalManagerFetching = {UserStore: {
    getRules: {isFeatching:false}
    getRooms: {isFeatching:false}
    getMoney: {isFeatching:false}
}

但是怎么做呢? 如何获得名称动作?

我的伪代码:

  @action
 async getMoney() {
     const methoneName = 'getMoney'; // how to get it automatically?
   try {
      globalManagerFetching[this.constructor.name][methoneName] = false;
      const data = await api.getMoney();
      globalManagerFetching[this.constructor.name][methoneName] = true;
   }
 }

我的其他伪代码:

  @action
 async getMoney() {
   try {
      setFetching(true);//how to do this?
      const data = await api.getMoney();
      setFetching(false);//how to do this?

   }
 }

请告诉我。 对不起,英语不好

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题的上下文,则希望避免代码重复。我建议通过以下方式重组代码来解决您的问题:

const { getRules, getRooms, getMoney} = api;

class UserStoreResource {
  @observable data = [];
  @observable isFetching = false;
  @observable error;

  constructor(fetchFunction) {
    this.fetchData  = async ( ) => {
      this.isFetching = ture;
      await fetchFunction();
      this.isFetching = false;
    }  
  }
}

class UserStore {
  rules = new UserStoreResource(getRules);
  rooms = new UserStoreResource(getRooms);
  money = new UserStoreResource(getMoney);

  @action
  async fetchAllData() {
    try {
      await Promise.all([
        this.rules.fetchData(),
        this.rooms.fetchData(),
        this.money.fetchData(),
        ])
    }
  }
} 

如果在组件中您将使用UserStoreResource中的任何可观察对象-您将获得正确的重新呈现。

回答有关获取函数名称的问题-可以通过请求属性arguments.callee.name来解决这个问题-但这是不建议使用的功能。 More here。最重要的是-如果需要此属性-这表明代码需要重组。

答案 1 :(得分:0)

您可以获得这样的函数名称

a = sf.Parameter('a',1,0,2) #name, initial value, minimum, maximum
a = sf.Parameter('a', value=1, min=0, max=2)