如何在异步 javascript 和 web3js 中将 return 值传递给调用函数

how to return value to caller function in asynchronous javascript and web3js

在下面的示例中,我可以看到 hashsomeFunction 写入控制台,但是我无法将 r 返回到 callerFunction。输出是 undefined。如何将 h 值返回给 callerFunction


async function caller(){
  var val = 10;
  let result = await someFunction(val);
  console.log(result);
}

async function someFunction(val) {
   let r = await contract.methods.updateValue(val).send({from: account})
   .on('transactionHash', function(h){
      console.log(h);
      return h;
   })

   return r; 
}

我尝试了以下几种变体:

变体 1

async function someFunction(val) {
   return contract.methods.updateValue(val).send({from: account})
   .on('transactionHash', function(h){
      console.log(h);
      return h;
   })

   return r; 
}

变体 2

async function someFunction(val) {
   return r = contract.methods.updateValue(val).send({from: account})
   .on('transactionHash', function(h){
      console.log(h);
      return h;
   })
}

变体 3

async function someFunction(val) {

   var result;
   let r = await contract.methods.updateValue(val).send({from: account})
   .on('transactionHash', function(h){
      console.log(h);
      result = h;
   })
   return result;
}

仍然无法正常工作....

最方便的方法是使用回调,如下所示:


async function caller(){
  var val = 10;
  await responder(val, async function(e, res){
    if(res.status === 'success' && res.hash) {
      //do stuff with res.hash
    } else {
      //handle error here 
    }
  })
}

async function responder(val, callback) {
   contract.methods.updateValue(val).send({from: account})
   .on('transactionHash', (hash) => {
      callback(null, {'status': 'success', 'hash': hash});
   })
   .on('error', (e)=> {
        callback(null, {'status': 'error', 'error': e.message})
    })
}