javascript - 从 async/await 块中提取部分代码到单独的函数中
问题描述
我有一个异步匿名自调用函数。函数前面的“异步”一词意味着该函数将始终返回一个承诺。如果代码中有返回值,那么 JavaScript 会自动将其包装到具有该值的已解析承诺中。
这种异步允许我们使用“等待”。关键字 await 使 JavaScript 等待,直到该承诺完成并返回其结果。因此,函数执行“暂停”并在 Promise 完成时恢复。这不会消耗任何 CPU 资源,因为引擎可以同时执行其他工作:执行其他脚本、处理事件等。
(async () => {
await page.goto('test.com', { waituntil: ['load', 'domcontentloaded', 'networkidle0'] });
await page.evaluate((user, pass) => {
document.querySelector('#user').setAttribute('value', user);
}, user, pass)
await page.click('button[type=submit].btn-primary');
for(var i = 0; i < 10; i++){
try {
await page.goto('test.com/second', { waituntil: ['load', 'domcontentloaded', 'networkidle0'] });
} catch(e) {
await page.goto('test.com', { waituntil: ['load', 'domcontentloaded', 'networkidle0'] });
await page.evaluate((user, pass) => {
document.querySelector('#user').setAttribute('value', user);
}, user, pass)
await page.click('button[type=submit].btn-primary');
}
// more stuff not relevant here
}
})();
但正如你在上面看到的,我有重复的代码。我想将重复的代码提取到一个单独的函数中。像这样的东西:
(async () => {
logIn()
for(var i = 0; i < 10; i++){
try {
await page.goto('test.com/second', { waituntil: ['load', 'domcontentloaded', 'networkidle0'] });
} catch(e) {
logIn()
}
// more stuff not relevant here
}
})();
function logIn(){
await page.goto('test.com', { waituntil: ['load', 'domcontentloaded', 'networkidle0'] });
await page.evaluate((user, pass) => {
document.querySelector('#user').setAttribute('value', user);
}, user, pass)
await page.click('button[type=submit].btn-primary');
}
但是,这不起作用,因为 await 仅在 aysnc 中起作用。现在一个想法是将 await 放在 logIn 调用前面,如下所示:
await logIn()
但事情就是这样。在该logIn
函数内部,我故意使用 await 3 次,因为我需要在下一个语句之前解决一个语句。
我怎样才能做到这一点?使用 async/await 并使用我的登录功能?
解决方案
上面的解决方案还意味着调用 login 的函数也需要是异步的,以及调用该函数的函数等,一直到代码库的顶部。
本质上,在任何地方使用 async 意味着您的所有函数都必须是异步的,并且必须使用 await 调用所有函数。
我希望我们可以只用 await/async 包装执行运算符,这样我们就不必将它传播到我们的整个应用程序中。
我希望有人能真正纠正我,因为我没有找到不涉及使所有函数异步并使用 await 调用它们的解决方案。
如果你这样做,请随时通过 rodney.barbati@gmail.com 给我发电子邮件。我会很感激。
推荐阅读
- python - 当图形包含多个子图时,matplotlib.widgets.TextBox 交互很慢
- vue.js - VueJs 使用属性值获取数组值
- java - 无法使用 Spring MVC 在 HTML ArrayList 中打印
- java - 是否需要检查通知通道是否已创建?
- flutter - 如何在颤动中使用“AnimatedModalBarrier”?
- ios - 获取本地存储数据的问题 - Swift
- pandas - 从列中拆分值并生成序列号
- sql - SQL Server 中的 XML 比较(字符串)
- php - Convert ISOdate to phpdate for ACF custom field query
- architecture - AUTOSAR架构中的AssemblySwConnector和DelegationSwConnector有什么区别?