首页 > 解决方案 > 在赛普拉斯的 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 解决的方法之王?

标签: javascriptasynchronouscypress

解决方案


使用 cypress 命令的组合,wrapeach能够实现一个等待每次迭代的循环,并且可以在不需要全局变量的情况下返回完整结果。

我使用该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)
})

推荐阅读