我有一个使用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;
});
}
答案 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>'