Вызов Drizzle Contract возвращает неожиданный объект

У меня есть функция просмотра в смарт-контракте, которая возвращает 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?

идеи?

Спасибо

Ответы (2)

Стандартный вызов также возвращает обещание в 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 автоматически изменит его в магазине, поэтому отображение будет немедленно обновлено. Это руководствобыл чрезвычайно полезен при объяснении того, как использовать призывы изморось. В нем гораздо более подробно объясняется, как и где использовать эту функцию.