У меня есть функция просмотра в смарт-контракте, которая возвращает uint.
На странице javascript Truffle Drizzle я делаю вызов при загрузке страницы:
this.contracts.TheContract.methods.getNumber.call()
Я бы ожидал, что объект большого числа. вместо:
arguments:[]
call: ƒ ()
encodeABI: ƒ ()
estimateGas:ƒ ()
send: ƒ ()
_ethAccounts:
Accounts {_requestManager: RequestManager, givenProvider: MetamaskInpageProvider, providers: {…}, _provider: MetamaskInpageProvider, …}
_method:
{constant: true, inputs: Array(0), name: "getNumber", outputs: Array(1), payable: false, …}
_parent:
Contract {_requestManager: RequestManager, givenProvider: MetamaskInpageProvider, providers: {…}, _provider: MetamaskInpageProvider, …}
__proto__:Object
Если я вызову этот объект, он вернет обещание; не то, что я ожидал от стандартного звонка.
cacheCall возвращает 0x0; пустой адрес? хм? Кому-нибудь удавалось использовать трюфель и морось без необходимости отката к стандартному web3?
идеи?
Спасибо
Стандартный вызов также возвращает обещание в web3. Таков ожидаемый результат.
myContract.methods.myMethod([param1[, param2[, ...]]]).call(options[, callback])
либо вы используете метод обратного вызова, либо обещаете, что получите ожидаемый результат
// использование обратного вызова myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}, функция(ошибка, результат){ ... }); // использование промиса myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'}) .затем (функция (результат) { ... }); // асинхронно / ожидание постоянный результат = ожидание myContract.methods.myMethod(123).call({from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'})
Если вы используете Drizzle, лучше всего использовать cacheCall()
. Как было объяснено в других ответах, стандартный вызов в web3 вернет обещание вместо возвращаемого значения, которое вы можете ожидать от кода контракта. Это связано с тем, что вызов выполняется асинхронно при выполнении, и значение не известно сразу. Обработка обещания была хорошо объяснена другими ответами, поэтому я не буду писать здесь снова.
Drizzle cacheCall()
более мощный, он сообщает Drizzle, что вы хотели бы отслеживать данные в магазине Drizzle. Drizzle будет отслеживать в блокчейне транзакции, взаимодействующие с вашим контрактом, и автоматически обновлять значение в хранилище, если данные контракта будут изменены. Возвращаемое значение cacheCall()
не является значением из контракта, вместо этого возвращается ключ, соответствующий значению в хранилище Drizzle. В вашем примере ключ хранилища 0x0
. Чтобы просмотреть значение getNumber, вы должны получить его из хранилища. Вы найдете его, this.props.TheContract.getNumber['0x0']
когда будете использовать его в render()
функции вашего Dapp. Каждый раз, когда транзакция по вашему контракту изменит это значение, Drizzle автоматически изменит его в магазине, поэтому отображение будет немедленно обновлено. Это руководствобыл чрезвычайно полезен при объяснении того, как использовать призывы изморось. В нем гораздо более подробно объясняется, как и где использовать эту функцию.
Филипп Гибб