Я хочу запустить 1 прогремевший http-запрос в настраиваемых чанках и установить настраиваемое время ожидания между чанк-запросами. Запрос основан на данных, предоставленных файлом some.csv.
Он не работает, потому что я получаю TypeError, но когда я удаляю () после f, он тоже не работает. Я был бы очень благодарен за небольшую помощь. Вероятно, самая большая проблема заключается в том, что я не совсем понимаю, как именно работают обещания, но я попробовал несколько решений и не смог добиться того, чего хочу.
Функция тайм-аута, вероятно, доставит мне еще больше головной боли поэтому я был бы признателен за любые советы для этого тоже.
Не могли бы вы помочь мне понять, почему это не работает?
Вот фрагмент:
const rp = require('request-promise');
const fs = require('fs');
const { chunk } = require('lodash');
const BATCH_SIZE = 2;
const QUERY_PARAMS = ['clientId', 'time', 'changeTime', 'newValue'];
async function update(id, time, query) {
const options = {
method: 'POST',
uri: `https://requesturl/${id}?query=${query}`,
body: {
"prop": {
"time": time
}
},
headers: {
"Content-Type": "application/json"
},
json: true
}
return async () => { return await rp(options) };
}
async function batchRequestRunner(data) {
const promises = [];
for (row of data) {
row = row.split(',');
promises.push(update(row[0], row[1], QUERY_PARAMS.join(',')));
}
const batches = chunk(promises, BATCH_SIZE);
for (let batch of batches) {
try {
Promise.all(
batch.map(async f => { return await f();})
).then((resp) => console.log(resp));
} catch (e) {
console.log(e);
}
}
}
async function main() {
const input = fs.readFileSync('./input.test.csv').toString().split("\n");
const requestData = input.slice(1);
await batchRequestRunner(requestData);
}
main();
Уточнение для первого комментария:
У меня есть CSV-файл, который выглядит следующим образом:
clientId,startTime
123,13:40:00
321,13:50:00
размер файла составляет ~ 100 тыс. Строк, файл содержит информацию о том, как обновить время для определенного clientId в базе данных. У меня нет доступа к базе данных, но у меня есть доступ к API, который позволяет обновлять записи в базе данных. Я не могу сделать 100 000 вызовов одновременно, потому что: моя сеть ограничена (я работаю удаленно из-за коронавируса), она потребляет много памяти, и API также может быть ограничен и может обработать sh, если я сделаю все запросы в один раз.
Чего я хочу достичь:
Загрузить CSV в память, преобразовать его в массив
Обрабатывать API запросы в чанках, например, берут первые две строки из массива, делают вызов API на основе первых двух строк, ждут 1000 мс, берут еще две строки и продолжают обработку до конца массива (файл csv)