
29.08.2021, 19:59
|
Новичок на форуме
|
|
Регистрация: 29.08.2021
Сообщений: 9
|
|
Запуск функции в асинхронном цикле
Здравствуйте! Помогите разобраться.
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().
|
|

29.08.2021, 20:07
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,145
|
|
nevalek,
у getElementsByClassName есть forEach?
|
|

29.08.2021, 20:36
|
Новичок на форуме
|
|
Регистрация: 29.08.2021
Сообщений: 9
|
|
Сообщение от рони
|
nevalek,
у getElementsByClassName есть forEach?
|
ну это же массив, это все срабатывает как надо, почему на второй итерации уже парсинг не работает, не могу понять
|
|

29.08.2021, 20:49
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,767
|
|
Вместо этого
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.
|
|

29.08.2021, 21:19
|
Новичок на форуме
|
|
Регистрация: 29.08.2021
Сообщений: 9
|
|
так, я переделал вот так
let h = doc.getElementsByClassName('test')
for (let i = 0; i > h.length; i++){
sb.push(h[i])
}
теперь, массив вообще пустой, хотя с forEach работало. Но суть не в этом, как заставить работать асинхронность?
|
|

29.08.2021, 21:26
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,767
|
|
for (let i = 0; i > h.length; i++){
Разве так надо?
|
|

29.08.2021, 21:40
|
Новичок на форуме
|
|
Регистрация: 29.08.2021
Сообщений: 9
|
|
Сообщение от рони
|
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. Как исправить?
|
|

29.08.2021, 22:11
|
 |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,767
|
|
Наверно проблема в Nightmare
Кто выдает строку
Process finished with exit code 0
Не большой знаток, но может быть, если вы используете .end(), то нельзя уже работать с этим экземпляром. Нужно заново
const nightmare = Nightmare()
Последний раз редактировалось voraa, 29.08.2021 в 22:17.
|
|

29.08.2021, 22:22
|
 |
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,596
|
|
Скорее всего так:
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.
|
|
|
|