javascript - 在赛普拉斯的 for 循环中等待异步方法
问题描述
编辑:为什么这不是重复的:因为Cypress,只需阅读而不是将所有内容标记为重复。
for
编辑 2:另外,请参阅答案以更好地理解常见的异步循环问题与此问题之间的差异。
我正在编写 cypress 测试,我想创建一个 cypress 命令,用用户列表填充我的数据库。我希望创建循环在进入下一个用户之前等待每个用户被创建(因为我希望以特定的顺序完成)。
现在,我的循环如下所示:
Cypress.Commands.add("populateDb", (users) => {
var createdItems = []
for (const user of users) {
cy.createUser(user, 'passe').then(response => {
createdUsers.unshift(response.body.user)
})
}
return createdItems
})
当然,这个循环不会等待每个用户被创建,然后再移动到下一个(我想要“顺序处理”,而不是“并行然后等待所有承诺解决”)
我在这里阅读了有关异步 for-loop 的答案:
但我似乎找不到我想要的,主要是因为赛普拉斯不允许我将我的函数声明为异步,如下所示:
Cypress.Commands.add("populateDb", async (users) => {
//Some code
})
如果我不声明它,async
我将无法使用await
.
是不是有一些get()
同步等待 Promise 解决的方法之王?
解决方案
使用 cypress 命令的组合,wrap
我each
能够实现一个等待每次迭代的循环,并且可以在不需要全局变量的情况下返回完整结果。
我使用该wrap
命令的唯一原因是因为 cypress 命令each
要求它与之前的 cypress 命令链接。该each
命令将评估每次迭代并最终调用then
可以返回完整结果数组的位置。我正在使用它来上传多个文件并返回密钥列表,但您可以根据自己的需要进行修改。
Cypress.Commands.add("uploadMultipleFiles", (files) => {
var uploadedS3Keys = []
cy.wrap(files).each((file, index, list) => {
cy.uploadFileToOrdersApi(file)
.then(s3Key => uploadedS3Keys.push(s3Key))
}).then(() => uploadedS3Keys)
})
推荐阅读
- automation - 如何使用 JMeter 使用命令行参数?
- apache-kafka - Kafka Connect 工作人员是机器/服务器还是只是一个 cpu 核心?
- list - 错误:尝试从 selenium 中的列表下拉列表中进行选择时出现此异常“选项元素不在选择中”
- c - C - 继续 n 次 for 循环
- azure - 如何将数据从一个 Azure EventHub 复制到另一个 Azure EventHub?
- kotlin - 以多态方式处理大量相似的单态类
- java - Jtable 查看选项
- javascript - 如何使对象解构元素的某些部分成为常量?
- java - 尝试使用 Hibernate 进行 SELECT 时发生 ConverterNotFoundException
- jmeter - 如何解决 Jmeter 中的超时错误