¿Cómo formar el objeto de transacción en una llamada asincrónica forzada por metamask?

Normalmente, para una llamada de contrato (es decir, algo que no actualiza ethereum), simplemente haría: var something = myContractObject.getSomething().

Recién comencé a usar metamasky, desafortunadamente, eso rompe con la queja de que tales llamadas no son asincrónicas. ¿Por qué? ¡Siempre han regresado sincrónicamente para mí! ¿Es porque solo he usado testrpco una red privada?

De todos modos, si debo hacer tales llamadas asíncronas, ya que hago muchas de esas llamadas, en lugar de escribir devoluciones de llamada para cada una de ellas, estoy tratando de escribir una función para manejarlo todo por mí. Algo como esto:

callHandler (_transactionObject) {
  let value = undefined
  this.web3.eth.call( _transactionObject, function(err, result) {
    if (err) {
      console.log(err)
      return undefined
    } else {
      return result
    }
  })
}

Eso depende del parámetro _transactionObject. He escrito una pequeña función que intenta formar eso:

getTransactionObject ( _data ) {
  const account = this.account
  return { from: account, data: _data }
}

Y así es como llamo a esa función:

const data = myContractObject.getSomething.getData()
var transactionObject = getTransactionObject(data)

Entonces simplemente intento replicar var something = myContractObject.getSomething()llamando a callHandler, es decir var something = callHandler(transactionObject).

... pero eso no funciona; parece que myContractObject.getSomething.getData()(que obtuve de aquí: https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-methods ), no devuelve los datos de llamada correctos para transactionObject. En cuyo caso, estoy un poco atascado: ¿cómo obtengo los datos de llamada que necesito y formo el formulario correcto transactionObject?

PD. Me doy cuenta de que hay otros problemas con ese código, entre otros, var something = callHandler(transactionObject)no es asíncrono, por lo que la asignación somethingnecesita envolverse en algún controlador asíncrono...

Respuestas (1)

En lugar de usar const data = myContractObject.getSomething.getData()para crear un transactionObject, resolví esto simplemente pasando myContractObject.getSomethinga callHandler, junto con una función de devolución de llamada. Algo como esto:

callHandler( myContractObject.getSomething, callbackFunction )

Y callHandlerse ve algo como esto:

callHandler (_func, _cb ) {
_func( function(err, result) {
  if (err) {
    console.log(err)
  } else {
    console.log("got result " + result)
    _cb(result)
  }
})

}

... funciona muy bien :)