如何遍历Node.js中的异步功能

时间:2018-12-18 01:14:27

标签: javascript node.js async-await

以下是示例代码,正在用于硒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的结果打印为driver.get()的输入。任何帮助,将不胜感激!

参考-https://github.com/dequelabs/axe-webdriverjs

3 个答案:

答案 0 :(得分:1)

因此,我将@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

P.S。如@ jfriend00所述(在下面的评论中),我们不知道AxeBuilder函数是否实际上返回了Promise。因此,在后一种情况下,前面的await(和async)可能是不必要的。

答案 1 :(得分:1)

使用Promise.all并映射一个url数组。

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

您将在数组finalResult中获得所有结果。

答案 2 :(得分:0)

上述解决方案可以使用,但是会序列化,即您将获得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返回(已解决/拒绝),{ {1}}并行执行。

编辑:使用异步函数的更简单方法。上面有点复杂,您可以使用异步功能实现同样的功能

analysePromises