Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.08.2021, 19:59
Новичок на форуме
Отправить личное сообщение для nevalek Посмотреть профиль Найти все сообщения от nevalek
 
Регистрация: 29.08.2021
Сообщений: 7

Запуск функции в асинхронном цикле
Здравствуйте! Помогите разобраться.
async function parceTarding(array){
    for (let v of array){
        console.log(v)
        await nightmare
            .goto(v)
            .wait('body')
            .evaluate(() => document.querySelector('body').innerHTML)
            .end()
            .then(response => {
                let parser = new DOMParser();
                let doc = parser.parseFromString(response, "text/html");
                let sb = []
                doc.getElementsByClassName('test').forEach((v)=>{
                    sb.push(v.innerHTML)
                })
                console.log(sb)
            }).catch(err => {
            console.log(err);
        })
    }
}


почему он парсит первую ссылку, выводит в консоль вторую ссылку и останавливается? Т.е. во-второй раз срабатывает только console.log().
Ответить с цитированием
  #2 (permalink)  
Старый 29.08.2021, 20:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

nevalek,
у getElementsByClassName есть forEach?
Ответить с цитированием
  #3 (permalink)  
Старый 29.08.2021, 20:36
Новичок на форуме
Отправить личное сообщение для nevalek Посмотреть профиль Найти все сообщения от nevalek
 
Регистрация: 29.08.2021
Сообщений: 7

Сообщение от рони Посмотреть сообщение
nevalek,
у getElementsByClassName есть forEach?
ну это же массив, это все срабатывает как надо, почему на второй итерации уже парсинг не работает, не могу понять
Ответить с цитированием
  #4 (permalink)  
Старый 29.08.2021, 20:43
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,714

Сообщение от nevalek
ну это же массив, это все срабатывает как надо, почему на второй итерации уже парсинг не работает, не могу понять
В javascript не все массив, что кажется им
Читайте документацию.
https://developer.mozilla.org/ru/doc...ntsByClassName
https://developer.mozilla.org/ru/doc...HTMLCollection
Ответить с цитированием
  #5 (permalink)  
Старый 29.08.2021, 20:49
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,714

Вместо этого
doc.getElementsByClassName('test').forEach(
надо делать
Array.from(doc.getElementsByClassName('test')).for Each( // ну не знаю, почему она в forEach пробел вставляет
или
[].forEach.call(doc.getElementsByClassName('test'), fun) // fun - нужная функция

или
doc.querySelectorAll('.test').forEach( // тоже не массив, но .forEach можно использовать

Последний раз редактировалось voraa, 29.08.2021 в 20:59.
Ответить с цитированием
  #6 (permalink)  
Старый 29.08.2021, 21:19
Новичок на форуме
Отправить личное сообщение для nevalek Посмотреть профиль Найти все сообщения от nevalek
 
Регистрация: 29.08.2021
Сообщений: 7

так, я переделал вот так
let h = doc.getElementsByClassName('test')
                for (let i = 0; i > h.length; i++){
                    sb.push(h[i])
                }

теперь, массив вообще пустой, хотя с forEach работало. Но суть не в этом, как заставить работать асинхронность?
Ответить с цитированием
  #7 (permalink)  
Старый 29.08.2021, 21:26
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,714

for (let i = 0; i > h.length; i++){
Разве так надо?
Ответить с цитированием
  #8 (permalink)  
Старый 29.08.2021, 21:40
Новичок на форуме
Отправить личное сообщение для nevalek Посмотреть профиль Найти все сообщения от nevalek
 
Регистрация: 29.08.2021
Сообщений: 7

Сообщение от рони Посмотреть сообщение
nevalek,
у getElementsByClassName есть forEach?
Сообщение от voraa Посмотреть сообщение
for (let i = 0; i > h.length; i++){
Разве так надо?
Гля, вы издеваетесь
async function parceTarding(array){
    for (let v of array){
        console.log(v)
        await nightmare
            .goto(v)
            .wait('body')
            .evaluate(() => document.querySelector('body').innerHTML)
            .end()
            .then(response => {
                let parser = new DOMParser();
                let doc = parser.parseFromString(response, "text/html");
                let sb = []
                let h = doc.getElementsByClassName('test')
                console.log(h)
                console.log(sb)
            }).catch(err => {
            console.log(err);
        })
    }
}


Код:
https://url
[
  Node { namespace: null, text: undefined, _selfCloseTag: false },
  Node { namespace: null, text: undefined, _selfCloseTag: false },
  Node { namespace: null, text: undefined, _selfCloseTag: false }
]
https://url

Process finished with exit code 0
все нет цикла внутри, код выполняется один раз, на второй только console.log. Как исправить?
Ответить с цитированием
  #9 (permalink)  
Старый 29.08.2021, 22:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,714

Наверно проблема в Nightmare

Кто выдает строку
Process finished with exit code 0

Не большой знаток, но может быть, если вы используете .end(), то нельзя уже работать с этим экземпляром. Нужно заново
const nightmare = Nightmare()

Последний раз редактировалось voraa, 29.08.2021 в 22:17.
Ответить с цитированием
  #10 (permalink)  
Старый 29.08.2021, 22:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,505

Скорее всего так:
async function parceTarding(array){
  for (let v of array){
    console.log(v)
    await nightmare
      .goto(v)
      .wait('body')
      .evaluate(() => Array.from(
        document.querySelectorAll('.test'), 
        v => v.innerHTML
      ))
      .then(console.log)
      .catch(console.error);
  }
}

// ... в конце всего
nightmare.end();


Nightmare не юзал, но проблема очевидно в end():
Цитата:
end()
Completes any queue operations, disconnect and close the electron process.
Также непонятно нахрена ты гоняешь body в html и обратно, если можно сразу работать с DOM в evaluate.

Ну и HTMLCollection которую должен возвращать getElementsByClassName действительно не имеет метода forEach(потому что это динамическая коллекция, которая может поменяться в процессе выполнения), но возможно Nightmare добавляет какие-то свои методы для удобства.
__________________
29375, 35

Последний раз редактировалось Aetae, 29.08.2021 в 22:25.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание функции в цикле, замыкания, промисы fjay69 Общие вопросы Javascript 4 22.02.2020 16:13
Отловить запуск функции tenebrosus Общие вопросы Javascript 8 14.12.2016 10:24
Запуск функции mrKot Общие вопросы Javascript 3 16.01.2016 06:17
Запуск функции после загрузки дива qwe88 Общие вопросы Javascript 18 01.09.2015 10:40
Запуск функции с задержкой Hapson Общие вопросы Javascript 14 02.04.2014 18:45