Как мне пройти через асинхронную функцию в Nodejs - PullRequest
0 голосов
/ 18 декабря 2018

Вот пример кода, который используется для интеграции Selen WebDriver JS ax для проверки доступности моего сайта -

var AxeBuilder = require('axe-webdriverjs');
var WebDriver = require('selenium-webdriver');

var driver = new WebDriver.Builder()
  .forBrowser('firefox')
  .build();

driver
  .get('https://dequeuniversity.com/demo/mars/')
  .then(function() {
    AxeBuilder(driver).analyze(function(err, results) {
      if (err) {
        // Handle error somehow
      }
      console.log(results);
    });
  });

Здесь анализируется один URL-адрес.Может кто-нибудь помочь мне с тем, как я могу разобрать несколько URL-адресов?Я хотел бы распечатать результаты всех URL-адресов, предоставляемых в качестве входных данных для driver.get ().Любая помощь будет оценена!

Справка - https://github.com/dequelabs/axe-webdriverjs

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

вышеупомянутое решение будет работать, но оно будет сериализовано, т.е. вы получите результат обещания driver.get и затем analyze результат одного URL перед переходом к следующему.возможно, вы могли бы использовать promise.all, чтобы делать все это параллельно.Что-то в строках

function executeGetPromises() {
    var getPromises = [];
    var drivers = [];
    for (const url of [url1, url2, url3]) {
        var driver = new WebDriver.Builder().forBrowser('firefox').build();
        getPromises.push(driver.get(url));
        drivers.push(driver);
    }

    var analysePromises = [];
    int index = 0;
    Promise.all(getPromises.map(p => p.catch(e => e)))
        .then(results => {
            for (int i=0; i< results.length; i++) {
                var result = results[i];
                if (!(result instanceof Error)) {
                    analysePromises.push(AxeBuilder(drivers[i]).analyze);
                }
            }
        executeAnalysePromises(analysePromises);
    });
}

function executeAnalysePromises (analysePromises) {
    Promise.all(analysePromises.map(p => p.catch(e => e)))
    .then(results => {
        results.forEach(result => {
            if (!(result instanceof Error)) {
                console.log(result);
            }
        });
    });
}

здесь мы отслеживаем все drivers, и все обещания driver.get выполняются параллельно и как только все возвращаются getPromises (либо разрешены /отклонено), analysePromises выполняется параллельно.

РЕДАКТИРОВАТЬ: более простой подход с использованием асинхронных функций.Выше немного сложнее, вы можете добиться того же, используя асинхронные функции

async function executeTask (driver, url) {
    try{
        await driver.get(url);
        let result = await AxeBuilder(driver).analyze();
        return Promise.resolve(result);
    } 
    catch(err) {
        return Promise.reject(err);
    }
}

function iterateThroughUrls(urls) {
    urls.forEach(url => {
        var driver = new WebDriver.Builder().forBrowser('firefox').build();
        executeTask(driver, url).then(result => {
            console.log(result);
        }).catch(err => {
            //handle errors
        });
    });
}
0 голосов
/ 18 декабря 2018

Используйте Promise.all и сопоставьте массив URL.

const urlArray = [url1,url2,url3,...];
const finalResult = await Promise.all(urlArray.map(async url=>{
   return await driver.get(url);
}))

, вы получите весь результат в массиве finalResult.

0 голосов
/ 18 декабря 2018

Поэтому я отформатирую комментарий @ CertainPerformance в качестве ответа.

Самый простой подход - использовать современный синтаксис async/await:

for (const url of [url1, url2, url3]) {
    await driver
      .get(url)
      .then(async function() {
        await AxeBuilder(driver).analyze(function(err, results) {
          if (err) {
            // Handle error somehow
          }
          console.log(results);
        });
      });
}

Не забудьте заменить url1, url2, url3 с вашими URL.

PS как указано @ jfriend00 (в комментариях ниже), мы не знаем, действительно ли функция AxeBuilder возвращает обещание или нет.Так что await перед ним (и async) может быть ненужным в последнем случае.

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