Реагировать на componentDidMount setState, но возвращать неопределенное значение

Я могу получить список с помощью метода get axios.get. тогда я могу использовать setState, и он работает безупречно. но возврат не соответствует действительности, он возвращает undefined console.info(result) => undefined . Как я могу проверить, работает ли setState нормально, возвращает true или возвращает false?

getList = async () => {
  await axios.get("http://localhost:5000/list").then((response) => {
    this.setState(
      {
        copy: response.data.list,
      },
      () => {
        return true;
      },
    );
  });
};

componentDidMount = () => {
  this.getList().then((result) => {
    console.info(result);
  });
};

Какое именно сообщение об ошибке вы получаете? Вы вызываете this.getlist, но getLIst — это асинхронная функция, но она ничего не возвращает. Я ожидаю, что результат await this.getList() будет undefined

dwjohnston 21.03.2022 09:08
setState возвращаемое значение не имеет значения. setState всегда работает (если что-то не сильно сломалось).
AKX 21.03.2022 09:08

@dwjohnston Я не получаю никаких ошибок, просто console.info не определен.

zafer 21.03.2022 09:10

@zafer это имеет смысл. Вы ничего не возвращаете от своей функции getList

dwjohnston 21.03.2022 09:10
getList ничего не возвращает, как и финальное then в цепочке обещаний axios
evolutionxbox 21.03.2022 09:11

@dwjohnston хорошо, как я могу проверить, пришел ли запрос в список или нет?

zafer 21.03.2022 09:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
6
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Второй аргумент для установки состояния может return true, но он никуда не денется. Нужно как-то его использовать, например:

const response = await axios.get("http://localhost:5000/list")

return new Promise((resolve) => {
  this.setState({
    copy : response.data.list
  }, () => {
    resolve(true);
  })
})

теперь цепочка будет работать, потому что вы разрешаете цепочку промисов с помощью true вместо того, чтобы возвращать ее из функции обратного вызова

Ответ принят как подходящий

Ваше утверждение return true находится в обратном вызове setState после установки. Он не будет распространяться на промис, возвращенный из getList; действительно, вы ничего не возвращаете из этой функции (вы даже не возвращаете обещание Axios; если вы вернете его, вы получите ответ, зарегистрированный в вашем console.info, но он будет зарегистрирован до завершения обратного вызова setState), поэтому вы получаете undefined в console.info.

Если вам нужно getList вернуть промис, который разрешается в true после установки состояния, вам понадобится

getList = () => {
  return new Promise((resolve) =>
    axios.get("http://localhost:5000/list").then((response) =>
      this.setState(
        {
          copy: response.data.list,
        },
        () => resolve(true),
      ),
    ),
  );
};

componentDidMount = () => {
  this.getList().then((result) => {
    console.info(result);
  });
};

Другие вопросы по теме