Обычно для вызова контракта (то есть чего-то, что не обновляет Эфириум) я бы просто сделал: 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
требует переноса в какой-то асинхронный обработчик....
Вместо того, чтобы использовать 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)
}
})
}
... работает хорошо :)