Проблема Promise.all () с использованием setTimeout (), состояние не обновляется - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть функция стрелки, которая вызывается из cDM для получения обновленного статуса расписаний каждые 20 секунд с setTimeout().

componentDidMount() {
    //get request to /schedules
    //update state with response data
    this.getUpdatedStatus();
}

Каждое расписание, представленное на /schedules, выглядит следующим образом:

"data": {
"id": "2147483605",
"selfUri": "/schedules/2147483605",
"type": "Schedule",
"status": "Pending",
}

Итак, в приведенном ниже методе запрашивается каждый schedule.selfUri, и я пытаюсь обновить status каждого расписания.

    getUpdatedStatus = () => {
//fetch updated status,
const schedules = this.state.schedules;
Promise.all(
  schedules.map(schedule =>
    axios({
      method: "get",
      url: schedule.selfUri,
    })
  )
)
  .then(response => {
    console.log(response);
    const isIncomplete = response.some(r => r.status !== "Complete");
    console.log(isIncomplete);
    if (isIncomplete) {
      this.timeout = setTimeout(() => this.getUpdatedStatus(), 20000);
    }
    this.setState(
      {
        scheduleStatus: isIncomplete ? "Pending" : "Complete",
      },
      () => {
        console.log(this.state.scheduleStatus);
        console.log(this.state.schedules);
      }
    );
  })
  .catch(error => console.log(error.response));

};

Функция setTimeout работает и запрашивает каждые 20 секунд, чтобы получить возможное обновление статуса.Ответ объекта в конечном итоге возвращает статус complete, но значение не отображается повторно в моей таблице.Я считаю, что есть проблема с моей цепочкой обещаний, и использование setTimeout не обновляет мой this.state.scheduleStatus, когда он завершается.Я приложил кодовую коробку, которая дает лучшее представление о моей проблеме.

Кодовая коробка

1 Ответ

0 голосов
/ 11 декабря 2018

Не думаю, что ваша проблема связана с цепочкой обещаний или использованием setTimeout().Я думаю, что это вызвано неправильным получением значения для флага isIncomplete, что оно всегда устанавливается на true.

Вы устанавливаете это значение в следующей строке:

const isIncomplete = response.some(r => r.status !== "Complete")

Я думаю, что проблема здесь в том, что вы ожидаете, что объект ответа будет указанными вами данными, который содержит свойство status со строковым значением, тогда как на самом деле это объект ответа, возвращаемый Axios, гдеСвойство status - это код состояния фактического ответа (200 в случае успеха).Следовательно, isIncomplete всегда равно true, поскольку r.status никогда не равно "Complete".

Ваши данные могут быть найдены в свойстве data, и поэтому вышеупомянутая строка должна выглядеть следующим образом:

const isIncomplete = response.some(r => r.data.status !== "Complete")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...