реагировать на свойство компонента

У меня есть компонент, который раньше вызывал функцию синхронизации executeCode. Проблема в том, что моя executeCode является асинхронной функцией, эти функции возвращают true или false, но теперь моя функция асинхронная, мне нужно использовать ожидание, чтобы получить значение, потому что асинхронные функции дают обещание. Проблема в том, что я не могу использовать ожидание, я пробовал анонимную функцию или обещание с .then(), но в данном случае это неприменимо, потому что мне нужно немедленно получить значение. executeCode теперь асинхронный, потому что он нужен для других операций.

executeCode = async ( methodCode ='', params = {} ) => {
  const result = await crudCode[methodCode](params);
  return result.valueToReturn;
};

render() {
  return (
    <Field
      name="datedeferred"
      component={FormField}
      executeCode={this.executeCode}
      typeInput="text"
      disabled={ 
        this.executeCode( 'onDisabled', { inputFullNameWithLine: 'datedeferred',formProps: this.props })
      }
    />
  );
}

person DDave    schedule 30.06.2018    source источник


Ответы (1)


Вы можете запустить свою функцию async в componentDidMount и вместо этого поместить результат в state и использовать это.

Пример

function someAsyncCheck() {
  return new Promise(resolve => setTimeout(() => resolve(true), 1000));
}

class App extends Component {
  state = { loading: true, disabled: false };

  async componentDidMount() {
    const result = await someAsyncCheck();
    this.setState({ loading: false, disabled: result });
  }

  render() {
    const { loading, disabled } = this.state;

    if (loading) {
      return null;
    }

    return <input disabled={disabled} />;
  }
}
person Tholle    schedule 30.06.2018
comment
спасибо, но я не могу изменить логику, это сложно, есть onchange с debounce, которые постоянно изменяют состояние, мой вопрос не об изменении логики, а об управлении асинхронностью и ожиданием внутри свойства - person DDave; 30.06.2018
comment
@DDave У вас не может быть асинхронной логики в render, поэтому я изменил логику. Сделать это таким образом просто невозможно. - person Tholle; 30.06.2018