Как получить название метода (@action)? - PullRequest
0 голосов
/ 26 января 2019
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 голосов
/ 29 января 2019

вы можете получить имя функции, как это

const methodName = arguments.callee.name
0 голосов
/ 27 января 2019

Если я правильно понимаю контекст вашего вопроса - вы хотели бы избежать дублирования кода. Я бы порекомендовал вам решить эту проблему путем реструктуризации кода следующим образом:

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 - но это устаревшая функциональность. Подробнее здесь . Больше всего - если вам нужно это свойство - это показатель того, что код требует реструктуризации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...