The MetaMask Web3 object does not support synchronous methods like eth_call without a callback param

关键就是加入回调函数,调用的函数需要传参就写好传入的参数再加回调函数,不传参就直接加回调函数:

例1:需要传参的web3.personal.unlockAccount(addr,password)函数

web3.personal.unlockAccount(_addr,_password,function(err,res){
    if(!err) {
        console.log(res);
    }else{
        console.log(err);
    }
}));
var res = myContract.function.call();

以及上面这个情况,加入回调就是:

myContract.function.call(function (err, res) {
  //do stuff
})

err是错误信息,res是返回结果(result)

回调里面就写你的判断和对错误信息的处理,比如:

myContract.function.call(function (err, res) {
  //do stuff
    if(!err) {
        console.log(res);
    }else{
        console.log(err);
    }
})

可为什么对我遇到的情况不太适用呢?因为我没有在调用方法。我用的是web3.eth.accounts[i]在访问账户列表,这其实并不是一个方法呀,如何加入回调?感觉很别扭,后来我想到用getAccounts这一方法先得到所有地址,然后取出我们需要的那个,代替我们的accounts[i]就可以了:

  var s;
  web3.eth.getAccounts(function callback(err, value) {
      if(!err){
          s = value[i];
          console.log(s);
      }
      else {
          console.log(err);
      }});

这样我们就可以在遍历中像往常一样取出accounts[i],并且也加入了回调。

所以for循环这部分修改后的完整代码如下:

for(var i = 0; i < web3.eth.accounts.length; ++i) {
        var s;
        var owner = VotingAddr.owner(function callback(err, value) {});

        web3.eth.getAccounts(function callback(err, value) {
          if(!err){
            s = value[i];
            console.log(s);
          }
          else {
            console.log(err);
          }});

        if(owner == s) {
          Select += "<option value='" + i + "'>" + web3.eth.accounts[i] + "</option>";
          foundOwner = true;
        }
      }

VotingAddr.owner()其实是一个方法,所以也要加入回调,和上面的博文提到的方法是完全一样的,在owner这里我没有加入回调的处理,也是可以运行的。

希望对你有所帮助。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值