一旦函数在Angular 4

时间:2018-03-08 20:53:36

标签: angular web3js web3

我有一个使用web3.js创建新帐户并返回帐户地址的功能。这是我的服务

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

我尝试过使用超时但没有运气,我正在为它定义。有什么想法?

更新

我以下列方式使用了承诺

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

但是我收到了这个错误 enter image description here

2 个答案:

答案 0 :(得分:2)

试试

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

答案 1 :(得分:0)

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

import 'rxjs/add/operator/toPromise';

参考:

Property 'toPromise' does not exist on type 'Observable<Response>'