Транспортир и асинхронный / ожидают - PullRequest
1 голос
/ 10 марта 2019

Это мой класс объектов Page

export class TopMenu {
  topbarMenu: ElementFinder;
  menuItems;
  numberofMenuItems: number;

  constructor() {
    console.log("TopMenu constructor called");
    this.setMenus();
  }

  async setMenus() {
    console.log("aaaaaaaaaa");
    this.topbarMenu = await element(by.css("ul[class*='topbar-menu']"));
    console.log("bbbbbbbbbb");
    this.menuItems = await this.topbarMenu.all(by.xpath("./li"));
    console.log("ccccccccc");
  }
}

это мой блок "это". Это отправная точка программы.

it("Click all Submenues 3", async () => {
    browser.waitForAngularEnabled(true);


    let topMenu: TopMenu = await new TopMenu();
    console.log("ddddddddddddddd");
}

Мой вывод такой:

**TopMenu constructor called
aaaaaaaaaa
bbbbbbbbbb
ddddddddddddddd
ccccccccc

как вы можете видеть из вышеприведенного вывода, "console.log (" ddddddddddddddd ")" вызывается ДО того, как эта строка будет разрешена "this.menuItems = await this.topbarMenu.all(by.xpath("./li")); в классе TopMenu"

можно ли это пропустить?

Я хочу выполнить любую строку, которую я прямо в блоке it, ПОСЛЕ того, как «TopMenu» будет полностью создано.

Как управлять потоком, как это?

1 Ответ

2 голосов
/ 10 марта 2019

await конструктор, если только вы не создаете Обещание (которым вы не являетесь) не имеет смысла, так как конструктор не может вернуть Обещание (кроме случаев, когда вы создаете Обещание)

Возможно, вы захотите сделать что-то вроде

export class TopMenu {
  topbarMenu: ElementFinder;
  menuItems;
  numberofMenuItems: number;
  somePromise;

  constructor() {
    console.log("TopMenu constructor called");
    this.somePromise = this.setMenus();
  }

  async setMenus() {
    console.log("aaaaaaaaaa");
    this.topbarMenu = await element(by.css("ul[class*='topbar-menu']"));
    console.log("bbbbbbbbbb");
    this.menuItems = await this.topbarMenu.all(by.xpath("./li"));
    console.log("ccccccccc");
  }
}

it("Click all Submenues 3", async () => {
    browser.waitForAngularEnabled(true);


    let topMenu: TopMenu = new TopMenu();
    await topMenu.somePromise;
    console.log("ddddddddddddddd");
}

Теперь ваш it блок будет ожидать обещания, возвращенного setMenus

примечание: основываясь на полученном вами результате, я могу с уверенностью сказать, что element(... НЕ является асинхронным (ну, он не возвращает обещание, он вполне может иметь асинхронность, но это не "выставлено" в все) - поэтому вам не нужно await element(....

...