tl;dr Нужна помощь с промисами.
Вот небольшая функция скребка, которая лежит в основе всего этого:
function request(method, url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.onload = resolve;
xhr.onerror = reject;
xhr.send();
});
}
У меня также есть довольно большой список профилей, которые я хотел бы решить:
const profiles = ['http://www.somesite.com/profile/1',
'http://www.somesite.com/profile/2'] // 100+ more
Как мне обрабатывать их партиями, скажем, по 5 за раз?
Вот мой мыслительный процесс:
- Разделить на части N с помощью _.chunk()
- Await Promise.all() разрешает указанный фрагмент
Вот что у меня есть до сих пор:
async function processProfileBatch(batchOfUrls) {
let promises = [];
// Populate promises
for (let i = 0; i < batchOfUrls.length; i++) {
let url = batchOfUrls[i]
promises.push(request('GET', url))
}
// Wait for .all to resolve
return await Promise.all(promises)
}
const profileBatches = _.chunk(profileLinks, 3)
for (let i = 0; i < profileBatches.length; i++) {
let processedBatch = await processProfileBatch(profileBatches[i])
console.log(new Date(), 'processedBatch', processedBatch);
}
К сожалению, это просто возвращает ProgressEvent
s; при проверке xhr, содержащегося внутри, имеет .responseText
значение «», хотя readyState
равно 4:
Promise.all
разрешается быстрее, чем должно, по какой-то необъяснимой причине. 02.06.2018