Вы можете использовать для l oop и await для управления потоком вашего скрипта в этом случае.
Я бы предложил использовать request-native- модуль обещания для получения предметов, поскольку он имеет интерфейс, основанный на обещаниях, но вы также можете использовать узел-выборку или топор ios (или любой другой http-клиент).
В этом случае, чтобы показать Вы, логик c, я создал фиктивный RP, который вы обычно создаете следующим образом:
const rp = require("request-promise-native");
Вы можете видеть, что мы перебираем элементы, по 50 за раз. Мы передаем последний идентификатор в качестве параметра url для следующего вызова rp. Теперь, очевидно, все будет по-другому, но я верю, что вы можете легко изменить логи c, как вам нужно.
const totalItems = 155;
const itemsPerCall = 50;
// Mock items array...
const items = Array.from({ length: totalItems}, (v,n) => { return { id: n+1, name: `item #${n+1}` } });
// Mock of request-promise (to show logic..)
// Replace with const rp = require("request-promise-native");
const rp = function(url) {
let itemPointer = parseInt(url.split("/").slice(-1)[0]);
return new Promise((resolve, reject) => {
setTimeout(() => {
let slice = items.slice(itemPointer, itemPointer + itemsPerCall);
itemPointer += itemsPerCall;
resolve( { products: slice });
}, 500);
})
}
async function getMultipleRequests() {
let callIndex = 0;
let lastID = 0;
const MAX_CALLS = 20;
const EXPECTED_ARRAY_LENGTH = 50;
for(let callCount = 1; callCount < MAX_CALLS; callCount++) {
// Replace with the actual url..
let url = "/products/" + lastID;
let importedData = await rp(url);
lastID = importedData.products[importedData.products.length - 1].id;
console.log("Call #: " + ++callIndex + ", Item count: " + importedData.products.length + ", lastID: " + lastID);
if (importedData.products.length < EXPECTED_ARRAY_LENGTH) {
console.log("Reached the end of products...exiting loop...");
break;
}
}
}
getMultipleRequests();