Как установить переменные объекта и вернуть их через метод - машинопись? - PullRequest
1 голос
/ 01 ноября 2019

** У меня есть набор, получить класс UserInfo, который используется для установки и получения переменных. Я хотел установить эти переменные из метода createNewUser() и вернуть объект UserInfo.

, когда я пытаюсь вернуть объект, он всегда дает мне нулевые значения. когда я пытался вернуть его из блока then, метод жалуется на отсутствие возвращаемого значения. **

 export default class UserInfo {
      private accountId!: string;
      private firstName!: string;
      private lastName!: string;

      constructor() {}

      /**
       * Gets Account Id
       */
      public getAccountId(): string {
        return this.accountId;
      }

      /**
       * Sets Account Id
       */
      public setAccountId(accountId: string) {
        this.accountId = accountId;
      }

    /**
       * Gets FirstName
       */
      public getFirstName(): string {
        return this.firstName;
      }

      /**
       * Sets FirstName
       */
      public setFirstName(firstName: string) {
        this.firstName = firstName;
      }

      /**
       * Gets LastName
       */
      public getLastName(): string {
        return this.lastName;
      }

      /**
       * Sets LastName
       */
      public setLastName(lastName: string) {
        this.lastName = lastName;
      }  

    }

    import UserInfo from '../../d/user-info'
    export default class QuickPage {
      constructor() {}

      lastNameText() {
        return cy.get('#lastName');
      }

     firstNameText() {
        return cy.get('#firstName');
      }

      accountIdText() {
        return cy.get('#accountId');
      }


    public createNewUser(): UserInfo {
        let userInfo =  new UserInfo();
        cy.getQuickRegisterUrl().then(url => {
          cy.log(url);
          cy.visit(url);

          this.firstNameText().getText().then((text) => {
            userInfo.setFirstName(text);
          });

          this.lastNameText().getText().then((text) => {
            userInfo.setLastName(text);
          });

          this.accountIdText().getText().then((text) => {
            userInfo.setAccountId(text);
          });    

        });
        return userInfo;
      }
    }

Я пытаюсь использовать приведенный выше код, а userinfo всегда возвращает undefined !!

Может кто-нибудь объяснить мне, как написать это в асинхронном формате?

Ответы [ 3 ]

1 голос
/ 01 ноября 2019

Создайте переменную UserInfo глобально в классе, установите их в своем методе createNewUser и получите доступ к ним, где бы вы ни вызывали класс QuickPage. нет необходимости писать тип возврата, вы можете написать так, и это будет работать

 import UserInfo from '../../d/user-info'
    export default class QuickPage {
      public userInfo: UserInfo;
      constructor() {
    this.userInfo = new UserInfo();
    }

      lastNameText() {
        return cy.get('#lastName');
      }

     firstNameText() {
        return cy.get('#firstName');
      }

      accountIdText() {
        return cy.get('#accountId');
      }


    public createNewUser(){
        let userInfo =  new UserInfo();
        cy.getQuickRegisterUrl().then(url => {
          cy.log(url);
          cy.visit(url);

         this.firstNameText()
          .getText()
          .then(text => {
          this.userInfo.setFirstName(text);
           });

          this.lastNameText()
          .getText()
          .then(text => {
          this.userInfo.setLastName(text);
          });

         this.accountIdText()
        .getText()
        .then(text => {
         this.userInfo.setAccountId(text);
         });
      });   
    }
  }
0 голосов
/ 02 ноября 2019

Поскольку createNewUser users cy команды, результаты этих команд доступны только при использовании функции then. В машинописи вы должны объявить тип возвращаемого значения как Chainable<UserInfo>, и вместо возврата userInfo вы должны вернуть cy.wrap(userInfo). Кроме того, в месте, где вы вызываете createNewUser, вы должны вместо непосредственного использования возвращаемого значения сделать что-то вроде этого:

    createNewUser().then(userInfo => { ... })

Причина, по которой в вашем коде вы получаете пустой объект, если все, что вызывается внутри then, выполняется асинхронно, и поэтому значение членов userInfo по-прежнему не устанавливается, когда метод возвращается.

0 голосов
/ 01 ноября 2019

Здравствуйте, вы можете сделать что-то подобное:

Решение, если все ваши методы являются асинхронными и возвращают обещание:

public async createNewUser(): UserInfo {
   let userInfo =  new UserInfo();
   return  cy.getQuickRegisterUrl().then(url => {
      cy.log(url);
      cy.visit(url);

      // if all this methode are async 
      return this.firstNameText().getText().then((text) => {
        userInfo.setFirstName(text);
        return  this.lastNameText().getText().then((text) => {
          userInfo.setLastName(text);

          return this.accountIdText().getText().then((text) => {
            userInfo.setAccountId(text);

            return Promise.resolve(userInfo);
          });
        });
      });
    });
  } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...