Promise 链与 Promise.all

2024-03-04

我的任务是使用量角器输入通知日期 我需要在输入之前清除内容,所以我想出了这个代码

 this.Then(/^I should enter "Notification Date"$/, () => {
    const d = new Date();
    return orderCheckOutPage.pageElements.recipientNotificationDateMonth.clear().then(() => {
        return orderCheckOutPage.pageElements.recipientNotificationDateMonth.sendKeys(d.getMonth() + 1).then(() => {
            return orderCheckOutPage.pageElements.recipientNotificationDateDay.clear().then(() => {
                return orderCheckOutPage.pageElements.recipientNotificationDateDay.sendKeys(d.getDate()).then(() => {
                    return orderCheckOutPage.pageElements.recipientNotificationDateYear.clear().then(() => {
                        return orderCheckOutPage.pageElements.recipientNotificationDateYear.sendKeys(d.getFullYear())
                    })
                })
            })
        })
    })
});

我的朋友告诉我上面的代码可以重构为

const promises = []; promises.push(orderCheckOutPage.pageElements.recipientNotificationDateMonth.clear()); promises.push(orderCheckOutPage.pageElements.recipientNotificationDateMonth.sendKeys(d.getMonth() + 1)); promises.push(orderCheckOutPage.pageElements.recipientNotificationDateDay.clear()); promises.push(orderCheckOutPage.pageElements.recipientNotificationDateDay.sendKeys(d.getDate())); promises.push(orderCheckOutPage.pageElements.recipientNotificationDateYear.clear()); promises.push(orderCheckOutPage.pageElements.recipientNotificationDateYear.sendKeys(d.getFullYear())); return promise.all(promises);

听说promise.all会开始一一解决promise

首先,它将转到第一个语句并尝试解决它是否[在上面的情况下是明确的月份]如果是异步的,它将跳转到第二个语句并尝试执行语句[将密钥发送到月份]

这里清理和进入的任务将并行运行

并根据承诺的解决时间执行任务

如果是这种情况,是否有机会在清除之前执行 sendkeys

如果我错了请纠正我...!!!!!


Protractor 有自己的 Promise 管理机制,称为控制流,为了简单地理解控制流,你可以认为它是一个队列。

当nodejs逐行执行Protractor脚本时,如果该行中的表达式返回一个promise,控制流会将promise添加到队列中。

所有行执行完成后,您将得到一个 Promise 队列,此时您的测试尚未完成,因为控制流将使您的测试等待队列中的所有 Promise 被执行。现在控制流将从队列中弹出一个 Promise 并执行并等待它完成,然后是下一个 Promise。

所以有了这样的机制,你的脚本就可以按照你写的顺序执行 记录在文件中。实际上控制流所做的事情比我在这里说的更复杂。

在你的情况下,你不需要使用嵌套的 then 链,你的代码就像回调金字塔,不代表承诺的优势(承诺是解决回调金字塔)。您的代码可以很简单,如下所示:

const d = new Date();
//input month
orderCheckOutPage.pageElements.recipientNotificationDateMonth.clear();
orderCheckOutPage.pageElements.recipientNotificationDateMonth.sendKeys(d.getMonth() + 1);
//input day
orderCheckOutPage.pageElements.recipientNotificationDateDay.clear();
orderCheckOutPage.pageElements.recipientNotificationDateDay.sendKeys(d.getDate());
//input year
orderCheckOutPage.pageElements.recipientNotificationDateYear.clear();
orderCheckOutPage.pageElements.recipientNotificationDateYear.sendKeys(d.getFullYear());

对于您的情况,无需使用promise.all(),因为代码的所有交互都不会从页面获取某些值。我将举一个例子来帮助您了解在什么情况下最好使用promise.all():

假设我有一个页面,它显示价格和金额。我需要按价格*金额来计算费用。

使用嵌套然后链:

var fee = ele_price.getText().then(function(price){

    return ele_amount.getText().then(function(amount){
        return price * amount;
    });
});

fee.then(function(fee){
    console.log(fee);
});

使用promise.all():

var fee = promise.all([
  ele_price.getText(),
  ele_amount.getText()
])
.then(function(datas){
    var price = datas[0];
    var amount = datas[1];
    return price * amount;
});

fee.then(function(fee){
    console.log(fee);
});

所以用promise.all(),一个then()就够了。这使您的代码比嵌套然后链更具可读性。

希望您现在明白为什么在您的情况下不需要使用promise.all()。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Promise 链与 Promise.all 的相关文章

  • 通过 Selenium 捕获 JSON 响应

    我正在使用 Selenium IDE 或 webdriver 测试网页 该网页有一个 搜索 功能 基本上只是一个带参数的 GET 调用 javascript 还输出以控制台从搜索调用返回的 JSON 即类似console log data
  • Selenium Webdriver - Python - leboncoin - pb 选择带重音的按钮

    我正在尝试在以下网站上自动填写表格 https www leboncoin fr https www leboncoin fr 我用 Selenium IDE 录制了一个脚本 我有一个通过单击 Se 连接器 按钮并填写我的密码和用户名来自动
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 在运行量角器测试时进行 API 调用

    我已经使用构建了一个网络应用程序angular2 0 and typescript 现在我正在写E2E为我的网站使用protractor 现在 在我的一项测试中 我需要进行 API 调用 HTTP GET 请求 并使用响应值作为测试用例中的
  • Watir 脚本偶尔返回 Net::ReadTimeout 错误

    我有一个 Watir 脚本 偶尔会意外地返回此错误 Net ReadTimeout 我搜索了这个错误并发现这个问题 https stackoverflow com questions 47452276 watir get sometimes
  • 将 Selenium 与 PyCharm CE 结合使用

    我正在尝试将 Selenium 与 PyCharm CE 一起使用 我已经使用 pip install Selenium 安装了 Selenium 并且可以通过终端使用它 但是当我尝试将它与 PyCharm 一起使用时 出现导入错误 Imp
  • Chrome 浏览器无法在 selenium webdriver 中打开

    我的代码没有启动浏览器 项目显示运行了很长时间 但没有任何反应 我按下打印并观察到WebDriver driver new ChromeDriver 没有被处决 package seleniumautomation import org o
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • Selenium Webdriver - Firefox 中元素不可点击错误

    通常在 Chrome 驱动程序中出现的元素不可点击错误也恰好在 Firefox 中出现 显示的错误消息 Exception in thread main org openqa selenium WebDriverException Elem
  • selenium 2.0 中的 isElementPresent

    大家好 我正在使用 webdriver 所以如果我想使用 selenium s rc 函数 isElementPresent 我必须模拟 selenium rc 所以我会执行以下操作 import org openqa selenium B
  • 45000 ms 内无法绑定锁定端口 70 54

    当我尝试使用 MVN 测试命令行运行我的 selenium 测试时 出现此错误 奇怪的是 我三天前尝试了一下 运行成功了 T E S T S Running GoogleNavigationTest Tests run 1 Failures
  • 在 selenium webdriver 中打开一个新窗口而不是新选项卡

    当在我的应用程序中手动单击链接时 它会在 Chrome 和 IE 中的新选项卡中打开 但是 当我的脚本运行时 该链接会在 IE 中的新窗口而不是新选项卡中打开 相同的脚本在 Chrome 中按预期运行 知道如何摆脱这个吗 更改 IE 的默认
  • 错误 11 秒后等待 Protractor 与页面同步超时

    我的量角器测试有问题 我的角度应用程序使用 timeout 不断从服务器轮询某些内容 不幸的是 当我运行测试时 这会导致以下错误消息 There was a webdriver error Error Timed out waiting f
  • Selenium 不会在新选项卡中打开新 URL(Python 和 Chrome)

    我想使用 Selenium WebDriver 和 Python 在不同的选项卡中打开相当多的 URL 我不确定出了什么问题 driver webdriver Chrome driver get url1 time sleep 5 driv
  • selenium-webdriver 与 webdriverjs 有什么区别(以及何时使用)?

    我是一位使用 selenium webdriver 的经验丰富的专业人士 我正在探索有关如何测试 javascript 应用程序的更多选项 我发现了 webdriverJs 不幸的是 我不明白这两者 2 之间有什么区别 有人可以解释一下何时
  • Selenium 中的断言和验证

    有人可以解释一下断言和验证之间的区别吗 我知道验证意味着它检查它是否存在 如果不存在 则测试失败并停止在那里 正确吗 那么 即使断言失败了 断言还会继续吗 我已经阅读了文档 但仍然无法理解它 不 你已经搞反了 在 Selenium IDE
  • 无法摆脱脚本中的硬编码延迟

    我用 vba 结合 selenium 编写了一个脚本来解析网页中可用的所有公司名称 该网页启用了延迟加载方法 因此每个滚动中只有 20 个链接可见 如果我滚动 2 次 则可见链接数为 40 个 依此类推 该网页中有 1000 个可用链接 我
  • 如何在 Capybara 中 POST 到 URL?

    刚刚从 Cucumber Webrat 切换到 Cucumber Capybara 我想知道如何将内容 POST 到 Capybara 中的 URL 在 Cucumber Webrat 中我能够执行以下步骤 When I send to d
  • 如何使用 Selenium WebDriver 设置浏览器客户端区域大小?

    我找到了如何在 Selenium 问题管理系统中设置浏览器窗口大小 请参阅浏览器窗口控件 174 https github com seleniumhq selenium google code issue archive issues 1
  • 每次我们调用浏览器时,在 selenium 中使用 driver.manage().window().maximize() 是否好?

    We use driver manage window maximize 最大化浏览器 我在网上看到一些使用的例子driver manage window maximize 尽管不需要最大化浏览器 例如 gmail 登录 我还看到使用 se

随机推荐

  • 如何使用 Express 和 NGINX 设置路由?

    我正在尝试使用 NGINX 作为反向代理来配置 Express 服务器 NGINX 提供静态文件 Express 提供动态内容 问题 正常的根链接有效 website com 但是当我导航到 website com api 时 我从 NGI
  • 将值合并到巨大的 XML 文件中

    我需要在一些巨大的 XML 文件中查找并组合信息 doc http www omegahat org RSXML Overview html 从那里添加到示例中 这或多或少是我的文件的样子 table table
  • C++(Visual Studio),无法将数字“10”写入文件,所有其他数字都有效?

    我这里有一个奇怪的问题 我正在尝试为 8 位 Windows 3 x 位图文件编写颜色表 我只是希望文件是灰度的 所以我尝试写入 bbb0 ggg0 rrr0 256 次 其中 r g b 1 256 write greyscale col
  • lambda 函数中的解构返回意外值

    当函数与解构一起使用时返回正确的预期值 k key1 v val1 k key2 v val2 k key3 v val3 console log JSON stringify k key1 v val1 z z1 k key2 v val
  • 是否有可能在整个层次结构中没有事件链的情况下,从 vue.js 中任意嵌套的子组件中改变属性?

    在多处提到 改变属性是一种反模式vue js 它警告用户不要这样做 即使在改变对象属性或使用诸如this set将元素添加到作为属性给出的对象 鉴于此 让组件负责修改给定的某些数据的正确方法应该是什么 这vue js建议的模式似乎正在发出事
  • ASP.NET 就地预编译未按预期工作

    我正在尝试使用 ASP NET 预编译工具 aspnet compiler exe 在部署网站后对其进行编译 根据书籍定义 在网络计算机上运行就地预编译应该可以改善首页加载体验 编译工具编译每个 ASP NET 页面 将编译后的版本存储在
  • 设置值 XmlConfig

    您好 我正在尝试使用以下命令更改配置文件中的值设置
  • 有没有使用 AngularJS 的开源 Web 应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在我的下一个 WebApp 项目中使用 AngularJS 在开始之前 有两个问题想问 AngularJS 适合移动 Web 应用程序
  • Amazon EC2 容量和工作流程问题

    我希望你们中一些有使用亚马逊 EC2 经验的人能够提供一些建议 当然这将是主观的 这很好 我很确定你们的猜测会比我的更好 我计划将我客户的所有网站从共享托管环境迁移到 Amazon EC2 它们都是流量相当低的网站 最繁忙的网站每天接待大约
  • 链接到参数为Vue.js的路由

    我使用 Vue js 和 Laravel 渲染一个列出产品的简单表格 从那里我想链接到产品详细信息页面 如下所示 a href gt product id a 由于该表是基于数据对象在客户端生成的 因此我正在寻找最优雅的方法来实现它 同时不
  • 组织 JavaScript 代码

    我正在制作一个 JavaScript 应用程序 通常我所做的是制作不同的模块并获取用户输入或单击事件 document ready 功能 这对于小型应用程序来说效果很好 但是当我遵循相同的模式时 我的意思是获取点击事件 document r
  • jQuery UI datepicker:如何将下拉列表中的月份名称从短名称更改为长名称?

    我需要将月份名称从短名称更改为长名称在我的 jQuery UI 日期选择器中 我的属性是 datepicker regional de prevText x3c zur uuml ck nextText vor x3e monthNames
  • 在 Android Studio 中检查元素

    我们如何检查 android studio 中的元素 日食的对应物是Ctrl Shift I 选择变量或表达式后 按Ctrl Shift I 在网上找不到这个 请帮忙 In Mac OSX you can use command optio
  • 我可以使用常量名称的变量来访问 PHP 类常量吗? [复制]

    这个问题在这里已经有答案了 当访问类常量时 我 发现可以使用变量作为类名 例如 classname CONST VALUE 如果我想使用变量作为常量名称怎么办 例如self constant 这似乎不起作用 有解决方法吗 variable
  • Google OAuth 2.0 增量授权不起作用

    我有一个服务器端应用程序 需要访问 Google API 的组合 对于我们应用程序的某些用户 我们只需要访问一个 API 一组范围 例如 Google Drive 对于其他用户来说 需要访问另一个 API 范围 例如G 对于某些我们需要访问
  • 将 json 字符串反序列化为对象 - Silverlight

    今天下午我花了很长时间尝试在字符串中实现 JSON 的反序列化 一开始我使用的是数据契约Json序列化器因为我的环境是 Silverlight 但它似乎不支持使用开箱即用的字典 在许多其他问题中提出 作为替代方案 我决定暂时使用 JSON
  • openpyxl python 中自定义系列标题

    我正在尝试修改现有的 xlsx 表并使用 python 中的 openpyxl 模块向其中添加图形 但是在创建折线图时 系列标题显示为系列 1 系列 2 系列 3 系列 4 因为我需要将系列标题重命名为 A B C D 注意 该名称不是从任
  • ListView findViewById 返回 null

    我没有使用 ListActivity 因为我想扩展 FragmentActivity 相反 我尝试使用 ListView lv ListView findViewById R id mainListView 不幸的是 lv 为空 在我的 x
  • 如果是 JPG 图像,QLabel() 将不会加载像素图

    我想有一个QLabel 显示一个pixmap文件中的 JPG 图像 不能位于资源文件中 因为它是从网络下载的 但我在加载它时遇到问题 代码相当简单 label QLabel label setPixmap QPixmap image jpg
  • Promise 链与 Promise.all

    我的任务是使用量角器输入通知日期 我需要在输入之前清除内容 所以我想出了这个代码 this Then I should enter Notification Date gt const d new Date return orderChec