使用Async代码替换Promise代码,并使用JavaScript中的map()替换For循环

时间:2017-10-24 01:01:01

标签: javascript selenium promise async-await es6-promise

以下代码运行正常。但是,我想将函数中间的Promise代码(由注释表示)更改为异步代码,并用map()替换for循环。我该怎么做?

const main = async () => {
    try{
        const driver = await new webdriver.Builder()
            .withCapabilities(webdriver.Capabilities.chrome())
            .setLoggingPrefs(prefs)
            .forBrowser('chrome')
            .setChromeOptions(options)
            .build();

        // Start promise code
        await driver.findElements(By.css('input'))
        .then(function(elements){
            for(let i=0; i<elements.length; i++){
                elements[i].getAttribute("value")
                .then(function(val){
                    console.log(val);
                });
            }
        })
        .catch(function(error){
            console.log(error);
        });
        // End promise code

        await driver.quit();
    } catch (error) {
        console.log(error);
    }
};

main();

2 个答案:

答案 0 :(得分:2)

我猜你想要用不同风格的功能相同的代码替换一些承诺代码?如果是这样,这里的代码(可疑地)被压缩成两行:

// Start promise code
const elements = await driver.findElements(By.css('input'));
await Promise.all(elements.map(ele => ele.getAttribute('value').then(console.log))).catch(console.log);
// End promise code

您提到要使用async / await样式代码替换基于promise的代码。我一般会注意到这一点(尽管在这种情况下我觉得它有帮助),因为async / await无论如何都是基于promises(所以没有逃避它们)。学会喜欢这个承诺,只有在真正使代码更清洁时才使用async / await语法。

答案 1 :(得分:1)

由于您只是将信息转储到控制台,我建议:

// Start promise code
try {
  for (let element of await driver.findElements(By.css('input'))){
    console.log(await element.getAttribute("value"));
  }
} catch (error) {
  console.log(error);
}

这显示了async / await如何在循环中使用let很好地重新捕获命令式编程。

它与您的代码的不同之处在于它按顺序列出了属性(您的依赖于getAttribute时间)。

如果速度很重要,请在保持顺序的同时并行获取属性:

let elements = await driver.findElements(By.css('input'));
for (let val of await Promise.all(elements.map(e => e.getAttribute("value")))) {
  console.log(val);
}