#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
, а не возвращайте данные.