Когда вы используете асинхронную функцию, такую как
async () => {
try {
const response = await fetch(`https://www.reddit.com/r/${subreddit}.json`);
const json = await response.json();
setPosts(json.data.children.map(it => it.data));
} catch (e) {
console.error(e);
}
}
, она возвращает обещание, а useEffect
не ожидает, что функция обратного вызова вернет Promise, скорее она ожидает, что ничего не возвращается или функция не возвращается.
В качестве обходного пути для предупреждения вы можете использовать самопризывающуюся асинхронную функцию.
useEffect(() => {
(async function() {
try {
const response = await fetch(
`https://www.reddit.com/r/${subreddit}.json`
);
const json = await response.json();
setPosts(json.data.children.map(it => it.data));
} catch (e) {
console.error(e);
}
})();
}, []);
или, чтобы сделать ее более понятной, вы можете определить функцию и затем вызвать ее
useEffect(() => {
async function fetchData() {
try {
const response = await fetch(
`https://www.reddit.com/r/${subreddit}.json`
);
const json = await response.json();
setPosts(json.data.children.map(it => it.data));
} catch (e) {
console.error(e);
}
};
fetchData();
}, []);
второе решение облегчит чтение и поможет вам написать код для отмены предыдущих запросов, если новый был запущен, или сохранения последнего ответа на запрос в состоянии
Рабочие коды и коробка