Wie bildet man das transactionObject in einem durch Metamask erzwungenen asynchronen Aufruf?

Normalerweise würde ich für einen Vertragsanruf (dh etwas, das Ethereum nicht aktualisiert) einfach tun: var something = myContractObject.getSomething().

Ich habe gerade angefangen metamask, , und leider bricht das mit der Beschwerde, dass solche Aufrufe nicht asynchron sind. Warum? Sie sind für mich immer synchron zurückgekehrt! Liegt das daran, dass ich nur testrpcein privates Netzwerk verwendet habe oder?

Wie auch immer, wenn ich solche Aufrufe asynchron machen muss, versuche ich, da ich viele solcher Aufrufe mache, anstatt Rückrufe für jeden von ihnen zu schreiben, eine Funktion zu schreiben, die alles für mich handhabt. Etwas wie das:

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

Das hängt vom Parameter ab _transactionObject. Ich habe eine kleine Funktion geschrieben, die versucht, das zu bilden:

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

Und so nenne ich diese Funktion:

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

Dann versuche ich es einfach und repliziere var something = myContractObject.getSomething(), indem ich anrufe callHandler, dh var something = callHandler(transactionObject).

...aber das funktioniert nicht; Es scheint, dass myContractObject.getSomething.getData()(was ich von hier habe: https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-methods ) nicht die richtigen Anrufdaten für die transactionObject. In diesem Fall stecke ich etwas fest - wie bekomme ich die Anrufdaten, die ich brauche, und bilde das richtige transactionObject?

p.s. Mir ist klar, dass es andere Probleme mit diesem Code gibt, nicht zuletzt var something = callHandler(transactionObject)ist er nicht asynchron, daher somethingmuss die Zuweisung in einen asynchronen Handler eingeschlossen werden ....

Antworten (1)

Anstatt const data = myContractObject.getSomething.getData()eine zu erstellen , löste ich dies, indem ich einfach an zusammen mit einer Callback-Funktion transactionObjectübergab . Etwas wie das:myContractObject.getSomethingcallHandler

callHandler( myContractObject.getSomething, callbackFunction )

Und callHandlersieht in etwa so aus:

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

}

...funktioniert gut :)