Проблема в том, что ничто не гарантирует вам выполнение одного запроса перед другим, но это зависит от того, как реализована функция darkSky
.Насколько я могу догадаться из вашего кода, он будет выглядеть примерно так:
function darkSky(url, onTimeRequestSuccess, onError) {
return fecth(url).then(onTimeRequestSuccess).catch(onError);
}
Поскольку вы используете onTimeRequestSuccess
в качестве решения для обещания внутри darkSky
, ожидание в processArray
не будет ждать обещания получения, вместо этого будет ждать результата onTimeRequestSuccess
.Вот почему порядок не поддерживается.
Если вы хотите сохранить порядок (без переупорядочения после получения данных) и не иметь цепочку из 30 последовательных вызовов, одним из подходов может быть создание массива с обещаниямивсе запросы, дождитесь разрешения всех с помощью Promise.all
и затем установите весь массив в состояние.Например:
loadPreviousMonth = () => {
const current = {...this.state};
const promises = [];
for (let i=30; i >= 1; i--) {
const date = new Date();
const previousDay = Math.floor(date.setDate(date.getDate() - i) / 1000);
const url = `/api/darksky?latitude=${current.latitude}&longitude=${current.longitude},${previousDay}`;
promises.push(fetch(url));
}
Promise.all(promises).then((results) => this.setState({results: results}));
}