代码之家  ›  专栏  ›  技术社区  ›  Justin Dearing

为什么浏览器。wait(ExpectedConditions.presenceOf())导致我的方法链返回Promise<Promise<boolean?>>

  •  1
  • Justin Dearing  · 技术社区  · 8 年前

    我正在写一些量角器测试,如下所示:

    import { browser, element, by, ExpectedConditions } from 'protractor';
    
    export class SomePage {
      private elements: any = {};
    
      navigateToUpdate(name: string) {
        return browser.get(`/policies/${name}`)
          .then(() => browser.waitForAngular())
          .then(() => browser.wait(this.statusIsPresent))
          .then(() => this.initElements());
      }
    
      private initElements(): Promise<void> {
          // Do stuff here
          return Promise.resolve();
      }
    
      private get statusIsPresent(): Function {
        return ExpectedConditions.presenceOf(element(by.id('status')));
      }  
    }
    

    因为 wait() navigateToUpdate() 退货 Promise<Promise<void>> 。我不明白为什么,我也不明白这是否是一个潜在的问题,产生了我不明白的bug。

    不管发生什么 browser.wait() 退货不应 Promise.resolve().then(() =>browser.wait()).then(() => something()) 返回任何内容 something() 回报,而不是任何承诺 某物() 退货?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    8 年前

    量角器使用它自己的承诺库(实际上它们是在selenium模块中实现的,但这并不重要),并且它的定义没有正确地展开默认承诺(内置承诺)。如果使用量角器,则结果与预期一致:

    private initElements(): promise.Promise<void> {
        // Do stuff here
        return promise.fullyResolved(null)
    }
    navigateToUpdate(name: string) { // return type is inferred to promise.Promise<void>
        return browser.get(`/policies/${name}`)
        .then(() => browser.waitForAngular())
        .then(() => browser.wait(this.statusIsPresent))
        .then(() => this.initElements());
    }
    

    它还可以与 async/await

    async navigateToUpdate(name: string) {// return type is inferred to promise.Promise<void>
        await browser.get(`/policies/${name}`);
        await browser.waitForAngular();
        await browser.wait(this.statusIsPresent);
        await this.initElements();
    }
    

    如果有人试图读取承诺返回类型,这将导致错误,因为实现将打开承诺,而类型系统不知道这一点,并且它将告诉您承诺的结果是承诺,而实际上不是承诺。