Показать сообщение отдельно
  #11 (permalink)  
Старый 07.03.2021, 08:24
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Сообщение от 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));
});

Последний раз редактировалось voraa, 07.03.2021 в 08:44.
Ответить с цитированием