以下代码运行正常。但是,我想将函数中间的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();
答案 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);
}