Не удается получить доступ к общедоступной переменной (возвращает ноль)

Я новичок в программировании, и у меня возникла проблема, когда я не могу получить доступ к общедоступной переменной из контракта.

В контракте я объявил следующую общедоступную переменную:

uint public numFoodInfos;

В JS я пытаюсь вызвать эту переменную:

contractAdressF2F = "...";
ABIArrayF2F = ...;
dataF2F = "...";
myContractF2F = web3.eth.contract(ABIArrayF2F).at(contractAdressF2F);

myContractF2F.numFoodInfos.call(function (error, result) {
    if (!error)
        console.log(result.toNumber())
    else
        console.log(error);
});

Однако это возвращает «ноль».

Кто-нибудь видит здесь проблему? Я читал, что общедоступные переменные должны автоматически генерировать функцию получения.

К вашему сведению, я использую структуру метеора. Другие пользовательские функции того же контракта работают...

Ответы (1)

Попробуйте вызвать эту переменную, используя круглые скобки следующим образом:

myContractF2F.numFoodInfos().call(function (error, result) {
    if (!error)
        console.log(result.toNumber())
    else
        console.log(error);
});

Причина, по которой нам нужно добавить круглые скобки, объясняется здесь - https://solidity.readthedocs.io/en/latest/contracts.html#getter-functions (когда вы делаете переменную состояния общедоступной, компилятор автоматически генерирует функцию получения как описано в документации)

Я добавил скобки, как вы предложили, но затем получаю следующую ошибку: inpage.js:217 Uncaught Error: Объект MetaMask Web3 не поддерживает синхронные методы, такие как eth_call, без параметра обратного вызова. Подробнее см. на github.com/MetaMask/faq/blob/master/… .