В моем приложении React я загружаю API НАСА, чтобы получить фотографии Роверов. Чтобы позволить мне иметь лучшую структуру кода, я создал утилиту Promise с тайм-аутом, как показано ниже
export async function PromiseWithTimeout(promises, timeout) {
let promise = promises;
if (promises instanceof Array) promise = Promise.allSettled(promises).then(console.log);
return Promise.race([promise, throwTimeout(timeout)]);
}
export const throwTimeout = (msec, message = 'timeout') => reject(msec, message);
export const reject = (msec, retVal) => new Promise((_, r) => setTimeout(r, msec, retVal));
export const resolve = (msec, retVal) => new Promise((r) => setTimeout(r, msec, retVal));
Результат этой утилиты в качестве примера из console.log следующий:
0: {status: "fulfilled", value: {…}}
1: {status: "fulfilled", value: {…}}
2: {status: "fulfilled", value: {…}}
У меня есть результат вызова указанной выше функции, которая используется следующим образом внутри компонента, но проблема в .then()
, здесь я получаю, что forEach()
не определено, и когда я console.log(rovers) === undefined
I понятия не имею, что не так. Я получаю разрешение на выполнение своих обещаний, но я больше не вхожу в систему
componentDidMount = async () => {
try {
await PromiseWithTimeout(
[
getRoverManifest('curiosity'),
getRoverManifest('opportunity'),
getRoverManifest('spirit'),
],
3000
).then(
(rovers) => {
rovers.forEach(savePhotosManifest);
if (rovers.some((rover) => rover.photo_manifest === undefined))
this.setState({ error: true, isLoading: false });
this.setState({
isLoading: false,
rovers,
});
},
(error) => {
console.error('Error fetching Rover Manifests: ', error);
this.setState({ error: true, isLoading: false });
}
);
} catch (error) {
console.error('Error Mars Rover Page: ', error);
this.setState({
error: true,
isLoading: false,
});
}
};