Отключение браузера Asyn c через несколько итераций - PullRequest
0 голосов
/ 11 февраля 2020

Я проверил итерации с кукловодом в небольшом случае. Я уже читал, что общая причина отключения кукловода заключается в том, что сценарий Node не ожидает завершения действий кукловода . Поэтому я преобразовал все функции в моем фрагменте в асин c функции, но это не помогло.

Если небольшой случай с шестью итерациями сработает, я реализую его в моем текущем проекте с примерно 50 итерациями.

'use strict';

const puppeteer = require('puppeteer');

const arrIDs = [8322072, 1016816, 9312604, 1727088, 9312599, 8477729];

const call = async () => {
    await puppeteer.launch().then(async (browser) => {
        arrIDs.forEach(async (id, index, arr) => {
            await browser.newPage().then(async (page) => {
                await page.goto(`http://somelink.com/${id}`).then(async () => {
                    await page.$eval('div.info > table > tbody', async (heading) => {
                        return heading.innerText;
                    }).then(async (result) => {
                        await browser.close();
                        console.log(result);
                    });
                });
            });
        });
    });
};

call();

Ответы [ 3 ]

2 голосов
/ 12 февраля 2020

forEach выполняется синхронно. замените forEach на простой для l oop.

const arrIDs = [8322072, 1016816, 9312604, 1727088, 9312599, 8477729];
const page = await browser.newPage();

for (let id of arrIDs){
    await page.goto(`http://somelink.com/${id}`);
    let result = await page.$eval('div.info > table > tbody', heading => heading.innerText).catch(e => void e);
    console.log(result);
}

await browser.close()
1 голос
/ 12 февраля 2020

Помимо других ответов, я хочу отметить, что циклы asyn c и forEach работают не совсем так, как ожидалось. Одним из возможных решений является наличие пользовательской реализации, которая поддерживает это:

Функция утилиты:

async function asyncForEach(array: Array<any>, callback: any) {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array);
  }
}

Пример использования:

const start = async () => {
  await asyncForEach([1, 2, 3], async (num) => {
    await waitFor(50);
    console.log(num);
  });
  console.log('Done');
}

start();

Пройдя через эту статью от Себастьяна Шопена может помочь прояснить, почему async / await и forEach действуют неожиданно. Вот как суть .

1 голос
/ 11 февраля 2020

То, как вы отформатировали и вложили все, похоже на некое воплощение ада обратного вызова.

Вот мое предложение, оно не работает, но структура будет работать лучше для Asyn c / Await

const puppeteer = require("puppeteer");

const chromium_path_706915 =
  "706915/chrome.exe";

async function Run() {

    arrIDs.forEach(
        await Navigate();
    )
  async function Navigate(url) {
    const browser = await puppeteer.launch({
      executablePath: chromium_path_706915,
      args: ["--auto-open-devtools-for-tabs"],
      headless: false
    });

    const page = await browser.newPage();

    const response = await page.goto(url);

    const result = await page.$$eval("div.info > table > tbody", result =>
      result.map(ele2 => ({
        etd: ele2.innerText.trim()
      }))
    );


    await browser.close();
    console.log(result);
  }
}

run();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...