Javascript.RU

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

Сообщение от 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.
Ответить с цитированием
  #12 (permalink)  
Старый 07.03.2021, 12:44
Новичок на форуме
Отправить личное сообщение для Stanislavsonder Посмотреть профиль Найти все сообщения от Stanislavsonder
 
Регистрация: 06.03.2021
Сообщений: 5

voraa, нет, для результата нет разницы в последовательности обработанных страниц, параллельность тут только приветствуется. Поэтому я раньше именно так и обходил все страницы.
Нода выдает сообщения об ошибках, но обычно синтаксические больше. Там все было без ошибок.

Новый код работает как надо, каждый раз выдает одно и то же на выходе и нет сообщений об ошибке)

Спасибо, думаю задачку можно считать решенной)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать два значения внутрь promise js mystica Общие вопросы Javascript 2 18.11.2018 15:25
Асинхронность callback с return и throw victornalchik Элементы интерфейса 12 25.10.2018 08:53
Как асинхронно вызвать resolve() вне Promise? Malleys Общие вопросы Javascript 8 18.12.2016 08:00
разница callback и promise A1x1On2015 Angular.js 0 13.01.2016 13:10
Работа с textarea Rompo Events/DOM/Window 14 16.12.2013 17:41