Javascript 承诺是如何在量角器中得到解决的?

Javascript 承诺是如何在量角器中得到解决的?,javascript,jasmine,protractor,Javascript,Jasmine,Protractor,我有一个疑问,它是这样写的:无论是单个元素还是集合,查找web元素都是异步的,所以结果是一个承诺。因此,如果是这种情况,下面的代码段是如何工作的: describe('the contact list', () => { it('with filter: should find existing ' + 'contact "Craig Service"', () => { let tbody = element(by.tagName('tbody'));

我有一个疑问,它是这样写的:无论是单个元素还是集合,查找web元素都是异步的,所以结果是一个承诺。因此,如果是这种情况,下面的代码段是如何工作的:

describe('the contact list', () => {
 it('with filter: should find existing ' +
 'contact "Craig Service"', () => {
   let tbody = element(by.tagName('tbody'));
   let trs = tbody.all(by.tagName('tr'));
   let craigService = trs.filter(elem => {
   return elem.all(by.tagName('td')).get(1).getText()
     .then(text => {
       return text === 'Craig Service';
     });
   });
是否需要使用then()解析trs,在我们进入下一行使用过滤功能(craigService)之前? 如果这是由promise-manager处理的,那么我们可以使用相同的策略使用gettext()获取元素的文本,然后不使用then()使用它吗

如果这是由量角器承诺经理处理的

量角器承诺管理器(又名硒承诺管理器)从量角器6开始。所以忘了它吧

查找web元素是异步的

用我自己的话来说,查找web元素并对其进行操作(
click()
getText()
等)是异步的,因此会返回一个需要解决的承诺。但是你在这条线上有什么

let trs = tbody.all(by.tagName('tr'));
只是一个elementArrayFinder声明。它不返回承诺,因此它具有同步性。所以你可以在打开浏览器之前声明这个元素

如果您打算经常使用量角器,请将此页面标记为书签。在这一页上,他们说出每个命令返回的内容。如果它没有承诺。承诺或类似的东西,它就不需要解决(例外是
browser.get
,我碰巧知道这也是一个承诺,但他们没有提到)

回答你的问题

是否需要解决
trs

根据量角器页面
element()
不返回承诺,也不返回
element.all()
因此不需要解析

现在,当你知道如何找出你是否与承诺一起工作时,让我们谈谈如何解决承诺

  • 很好的旧
    .then()
    语法(不是很好,但确实很旧)
  • 现在当你知道这个方法时,把它从你的记忆中抹去。这是额外的信息,这将使您的代码不可读,并且极难调试。看看这个,你就会明白我在说什么

  • async/await
    这与在计算机上复制/粘贴一样好。上帝保佑这两者的创造者,我无法想象没有他们我的生活。那么来自#1的相同代码现在看起来是这样的
  • 当你看这个片段时,它不是更有意义吗?有关另一个示例,请参见。基本上,
    wait
    对javascript说“停止,解决承诺,返回它的值”

    总之,如果您使用
    async/await
    解决代码片段的承诺,您将得到

    describe('the contact list', () => {
      it('with filter: should find existing contact "Craig Service"', async () => { // pay attention to this async
        let tbody = element(by.tagName('tbody'));
        let trs = tbody.all(by.tagName('tr'));
        let craigService = await trs.filter(async elem => { // async again
          let text = await elem.all(by.tagName('td')).get(1).getText()
          return text === 'Craig Service'
        });
    

    不,你不能在不等待的情况下使用文本。上面代码中的一些行可以用“惰性评估”过程来解释——即使它们是异步的,只要这些操作不需要立即知道元素的实际值,您就可以对它们执行操作,而无需等待。另一方面,用文本值做事情并不是这样的……嗨,谢谢。你能帮我得到一些属于“惰性评估”的操作,以及我们需要等待的操作吗。任何文档或链接都是有用的。我想创建新Proactor对象的每个方法都会被延迟并异步执行,但是所有返回普通值的方法(例如
    getText
    )都会返回一个承诺。这是一个很棒的解释。谢谢,非常感谢;)
    let text = await element(by.css('.class')).getText();
    console.log(text)
    
    describe('the contact list', () => {
      it('with filter: should find existing contact "Craig Service"', async () => { // pay attention to this async
        let tbody = element(by.tagName('tbody'));
        let trs = tbody.all(by.tagName('tr'));
        let craigService = await trs.filter(async elem => { // async again
          let text = await elem.all(by.tagName('td')).get(1).getText()
          return text === 'Craig Service'
        });