Я работаю с разбитым на страницы REST API, который возвращает данные из запроса GET со следующей структурой:
{
"data": [
{ "id": "26007494656", "user_id": "23161357"},
{ "id": "26007492556", "user_id": "23124357"}...
],
"pagination": {
"cursor": "eyJiIjpudWxsLCJhIjp7Ik9mZnNldCI6MjB9fQ=="
}
}
Конечные точки могут возвращать максимум 100 элементов внутри data
массив на вызов, и их скорость ограничена 800 вызовами в минуту. Однако в любое время может быть от 100 000 до 200 000 доступных элементов данных для извлечения. Кроме того, значение курсора разбиения на страницы необходимо для последующих запросов, чтобы отметить начальную точку для следующего набора результатов, и это значение обновляется при каждом последующем запросе.
Хотя вряд ли удастся получить все данные, доступные с этой конечной точки, я решил эту проблему с помощью рекурсии:
function getAllData (cursor, data = [], counter = 35) {
while (counter !== 0) {
const request = new Request(url + (cursor ? '&after=" + cursor : "'), {
method: 'GET' ,
headers: {
'Client-ID': clientId,
'Authorization': `Bearer ${access_token}`,
'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
}
});
return fetch(request).then((response) => response.json()).then((responseJson) => {
if (counter === 1) return data;
data.push(...responseJson.data);
return getAllData(responseJson.pagination.cursor, data, --counter);
}).catch(showError);
}
}
Мне интересно, есть ли лучший способ подойти к работе с этим API с целью получить как можно больше данных, или эту функцию можно как-то оптимизировать. В counter
аргумент указывает, сколько раз должен быть выполнен рекурсивный вызов, а блок catch просто отображает сообщение об ошибке для пользователя. Я использую максимальное возвращаемое значение 100 объектов за вызов, поэтому в настоящее время он возвращает массив примерно из 3500 элементов данных.
Благодаря тому, как эта функция используется в моем приложении, ее можно вызывать до 4-5 раз в минуту, и, похоже, функции требуется примерно 6-7 секунд, чтобы завершить свои рекурсивные вызовы и вернуть данные. В настоящее время я использую эту функцию в клиентском файле Javascript, но я думаю о том, чтобы перенести часть этой логики на сервер Express.