Сообщение от Stanislavsonder
|
Теперь он делает очень странные задержки по секунд 10 между итерациями, всего сделал 10 итераций и потом закончил работу, не сохранив ничего)))
|
Просто закончил не выдав никакого сообщения об ошибке? Я нодой не пользуюсь, поэтому точно не знаю, но думаю она должна какие то месажы в консоль давать.
Раньше они могли выполняться параллельно, а тут я их последовательно запустил.
Возможно, что при обращении к странице произойдет какая то ошибка? Что в этом случае надо делать? Просто не помещать data в results?
И еще вопрос. Имеет ли значение, что в result данные должны быть именно в той последовательности, как URL (в зависимости от i)?
Ведь при параллельной обработке не гарантируется, что страница, запрошенная раньше, будет раньше и обрабатываться. Как считается так и обработается. А если использовать results.push(data), то данные в results будут идти той последовательности, как страницы считались и обработались.
Пока попробуй такой код. Тут страницы снова считываются параллельно, и есть некоторая обработка возможных ошибок в виде сообщений.
var request = require ('request');
var cheerio = require ('cheerio');
const fs = require('fs');
var results = new Array();
var pagesCount = 47;
let proms = [];
for (let i = 0; i < pagesCount; i++){
proms.push( new Promise ((res, rej) => {
let URL = 'здесь ссылка плюс ид страницы='+i;
request(URL, function (error, response, html) {
if (!error && response.statusCode == 200) {
let $ = cheerio.load(html);
$('tr:not(.spacer)').each(function(i, element){
// Тут происходит много строчек кода селекторов и записи в объект data.
console.log(data);
results.push(data);
});
res();
} else {
console.log(`Error ${error}, url: ${URL}, statusCode: ${response?.statusCode}`);
rej (error);
}
});
})
)
}
// В конце мне все это нужно сохранить в JSON, То есть записать массив result
Promise.allSettled(proms).then (_=> {
console.log('saving...');
fs.writeFileSync("data.json", JSON.stringify(results,null,4));
});