この解答例はChatGPTによって生成されています,正しいかは自己判断で。
BFE.devでのAI解答例 - JavaScript コーディング問題
56. ページネーションのつくAPIを叩く
以下は、forループを使った解法です。
const fetchListWithAmount = async (amount: number = 5) => {
const result = [];
let lastItemId = undefined;
while (amount > 0) {
const response = await fetchList(lastItemId);
const { items } = response;
if (!items || items.length === 0) {
break;
}
lastItemId = items[items.length - 1].id;
result.push(...items);
amount -= items.length;
}
return result;
};
この関数では、result
という配列を定義して、受け取ったアイテムをその配列に追加しています。
そして、lastItemId
を更新し、必要な数のアイテムが収集されるまで、APIを反復的に呼び出し、収集されたアイテムの数を減らしています。
items
が返されなくなった場合、またはアイテム数が0になった場合、ループは終了します。
以下は、Async iteratorsを使用した解決策です。
async function* listIterator(since?: number) {
let lastItemId = since;
while (true) {
const response = await fetchList(lastItemId);
const { items } = response;
if (!items || items.length === 0) {
break;
}
lastItemId = items[items.length - 1].id;
for (const item of items) {
yield item;
}
}
}
const fetchListWithAmount = async (amount: number = 5) => {
const result = [];
for await (const item of listIterator()) {
result.push(item);
if (result.length >= amount) {
break;
}
}
return result;
};
ここでは、listIterator
というasync generator関数を定義します。
この関数は、fetchList
とともにAPIを呼び出し、itemsを反復処理するためにfor-ofループを使用します。
この関数の返す値は、yieldによって生成されます。
fetchListWithAmount
は、listIterator
からアイテムを取得して、そのアイテムを含む配列を構築します。
必要な数のアイテムが構築されたら、ループは終了します。