如何设置对象变量并通过方法-Typescript返回它们?

时间:2019-11-01 15:04:10

标签: javascript typescript cypress

**我有一个集合,获取类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始终返回未定义!!

有人可以向我解释如何以异步格式编写吗?

3 个答案:

答案 0 :(得分:1)

在类中全局创建一个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);
         });
      });   
    }
  }

答案 1 :(得分:0)

由于createNewUser个用户cy命令,这些命令的结果只能通过then函数使用。在打字稿中,您需要将返回类型声明为Chainable<UserInfo>,而不是返回userInfo,而应返回cy.wrap(userInfo)。另外,在调用createNewUser的地方,应该执行以下操作,而不是直接使用返回值:

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

之所以在您的代码中获得一个空对象,是因为then内调用的任何操作都是异步执行的,因此userInfo的成员的值在以下情况下仍未设置方法返回。

答案 2 :(得分:-1)

你好,你可以做这样的事情:

如果所有方法都异步并返回promise的解决方案:

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);
          });
        });
      });
    });
  }