一旦函数在 Angular 4 中返回,就继续执行

proeceed the execution once a function has returned in Angular 4

我有一个函数,它使用 web3.js 创建一个新帐户和 return 帐户地址。这是我的服务

@Injectable()
export class ContractsService {
  private web3: any;
  public acc_no: any;

  public createAccount(): any {
      this.web3.personal.newAccount('abc123', function (error, result) {
      console.log("in funct");
       if (!error) {
         this.acc_no = result;
       } else {
         this.acc_no = 0;
       }
     }
   );
  }

}

我想调用此函数 createAccount,一旦该函数完成创建新帐户,我希望我的组件继续执行。这是我的组件调用此 createAccount 函数的函数。

registerUser() {
    if (this.signupData.username !== '' && this.signupData.password !== '' && this.signupData.firstname !== ''
      && this.signupData.lastname !== '') {
        this.contractService.createAccount();
        setTimeout(() => {
          console.log(this.contractService);
          }, 2000);
    }
  }

我试过使用超时,但没有成功,我正在为它未定义。有什么想法吗?

更新

我按以下方式使用了 promise

public createAccount(): Promise<any> {
       this.web3.personal.newAccount('abc123',  (error, result) => {
      console.log("in funct");
       if (!error) {
           this.acc_no = result;
       } else {
           this.acc_no = 0;
       }
     }
   ).toPromise()
        .then(() => {
          return this.acc_no;
        });
  }

但是我收到了这个错误

试试看

 public createAccount(): Promise <number>
 {

 return new Promise((resolve, reject) => {
      this.web3.personal.newAccount('abc123',  (error, result) => {
      console.log("in funct");
       if (!error) {
         this.acc_no = result;
         resolve(result);
       } else {
         this.acc_no = 0;
         resolve(result);
         //OR reject();
       }
     }
   );
  }
}

registerUser()
{
   //...
    this.contractService.createAccount().then(acc_no => 
    {
       console.log(acc_no);
    });
}

要使用 toPromise(),您需要包括:

import 'rxjs/add/operator/toPromise';

引用: