Как сформировать объект транзакции в принудительном асинхронном вызове метамаски?

Обычно для вызова контракта (то есть чего-то, что не обновляет Эфириум) я бы просто сделал: var something = myContractObject.getSomething().

Я только начал использовать metamask, и, к сожалению, это прерывается жалобой на то, что такие вызовы не являются асинхронными. Почему? Они всегда возвращались синхронно для меня! Это потому, что я использовал только testrpcчастную сеть?

В любом случае, если я должен делать такие вызовы асинхронно, поскольку я делаю много таких вызовов, а не пишу обратные вызовы для каждого из них, я пытаюсь написать функцию, которая будет обрабатывать все это за меня. Что-то вроде этого:

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

Это зависит от параметра _transactionObject. Я написал небольшую функцию, которая пытается сформировать это:

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

И вот как я вызываю эту функцию:

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

Затем я просто пытаюсь воспроизвести var something = myContractObject.getSomething(), позвонив callHandler, var something = callHandler(transactionObject)т.е.

... но это не работает; кажется, что myContractObject.getSomething.getData()(которое я получил отсюда: https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-methods ) не возвращает правильные данные вызова для transactionObject. В этом случае я немного застрял - как мне получить нужные мне данные о вызове и сформировать правильный transactionObject?

пс. Я понимаю, что с этим кодом есть и другие проблемы, не в последнюю очередь var something = callHandler(transactionObject)это не асинхронность, поэтому присваивание somethingтребует переноса в какой-то асинхронный обработчик....

Ответы (1)

Вместо того, чтобы использовать const data = myContractObject.getSomething.getData()для создания transactionObject, я решил эту проблему, просто перейдя myContractObject.getSomethingк callHandlerвместе с функцией обратного вызова. Что-то вроде этого:

callHandler( myContractObject.getSomething, callbackFunction )

И callHandlerвыглядит примерно так:

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

}

... работает хорошо :)