您可以单独关注每个ID并保留代码
DRY
:
const RAPIDAPI_KEY = "secret key";
async function fetchJsonData(endpoint, params) {
const init = {
headers: new Headers([
["x-rapidapi-key", RAPIDAPI_KEY],
["x-rapidapi-host", "nfl-api-data.p.rapidapi.com"],
]),
};
const url = new URL("https://nfl-api-data.p.rapidapi.com");
url.pathname = endpoint;
if (params) url.search = new URLSearchParams(params).toString();
const response = await fetch(url, init);
if (!response.ok) {
throw new Error(`Response not OK (${response.status})`, {
cause: response,
});
}
return response.json();
}
async function fetchFullName(id) {
try {
const data = await fetchJsonData("/nfl-ath-fullinfo", { id });
return data.athlete.fullName;
} catch {
throw new Error(`Name lookup for id '${id}' failed`);
}
}
async function fetchImage(id) {
try {
const data = await fetchJsonData("/nfl-ath-img", { id });
return data.image.href;
} catch {
throw new Error(`Image lookup for id '${id}' failed`);
}
}
async function fetchQuarterbackData(id) {
const [name, imageUrl] = await Promise.all([
fetchFullName(id),
fetchImage(id),
]);
return { id, name, imageUrl };
}
然后在组件中,您只需要映射一次:
export default function _quarterbacksPage() {
const [quarterbacks, setQuarterbacks] = useState([]);
useEffect(() => {
(async () => {
try {
const quarterbackIds = [3139477, 4241479, 3918298, 3915511, 2577417];
const qbs = await Promise.all(quarterbackIds.map(fetchQuarterbackData));
setQuarterbacks(qbs);
} catch (cause) {
console.error(cause);
}
})();
}, []);
return (
<>
<_navbar />
<div className={styles.cards}>
{quarterbacks.map(({ id, name, imageUrl }) => (
<div key={id} className={styles.card}>
<img src={imageUrl} alt="player picture" />
<Link className={styles.cardText} to={`/quarterback/${id}`}>
{name}
</Link>
</div>
))}
</div>
</>
);
}