Как выполнить циклическую синхронизацию с запросом GET — асинхронное сокращение

#reactjs #asynchronous #redux #async-await #synchronization

#reactjs #асинхронный #сокращение #асинхронный-ожидание #синхронизация

Вопрос:

 const measurements: { name: string, station: string, data: any[] }[] = [];
for (const selectedTrack of selectedTracks) {
    for (const trackCircuitId of selectedTrack.tcIDs) {
        await this.props.loadMeasurements(dateFrom, dateTo, trackCircuitId, selectedTrack.station);
        console.log(this.props.measurements);
        measurements.push({
            name: trackCircuitId,
            station: selectedTrack.station,
            data: this.props.measurements
        });
    }
}

this.setState({
    measurements: measurements,
    refresh: false
});
  

ожидайте этого.props.loadMeasurements(DateFrom, DateTo, trackCircuitId, selectedTrack.station);

Вызывает функцию action, и this.props.measurements — это реквизит, который возвращается Redux! Я пытаюсь заполнить список измерений и обновить его состояние по завершении и отобразить диаграмму.

Atm. когда я загружаю данные из this.props.measurements (…), this.props.measurements является асинхронным и пустым. Что делает данные всегда равными [].

Можно было бы использовать componentDidUpdate, но проблема связана с циклами.

Ответ №1:

Попробуйте использовать эту пользовательскую функцию цикла вместо for

 const asyncForEach = async function (array, callback) {
  for (let index = 0; index < array.length; index  ) {
    await callback(array[index], index, array)
  }
}

const asyncLoop = async () => {
  const measurements: { name: string, station: string, data: any[] }[] = [];
  try {
    await asyncForEach(selectedTracks, async selectedTrack => {
      await asyncForEach(selectedTrack.tcIDs, async trackCircuitId => {
        await this.props.loadMeasurements(dateFrom, dateTo, trackCircuitId, selectedTrack.station);
        console.log(this.props.measurements) // If it works well
        measurements.push({
          name: trackCircuitId,
          station: selectedTrack.station,
          data: this.props.measurements
        });
      })
    })

    this.setState({
      measurements,
      refresh: false
    });
  } catch (err) {
    console.log(err)
  }
}

asyncLoop()
  

Комментарии:

1. Не могли бы вы привести пример к моему коду выше, пожалуйста?

2. @dawood11 проверьте мой отредактированный код выше. Если есть какая-то ошибка, пожалуйста, добавьте комментарий

3. Извините, забыл сказать, что this.props.loadMeasurements — это функция действия, которая отправляет в reducer. он ничего не возвращает. Новое значение сохраняется в this.props.measurements

4. Если вы можете получить данные, this.props.measurements просто используйте this.props.measurements , а не возвращайте данные.