вышеупомянутое решение будет работать, но оно будет сериализовано, т.е. вы получите результат обещания 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
});
});
}