У меня есть вопрос к вам, ребята. У меня 2 контракта:
contract House {
uint public idHouse;
...
}
contract ArrayHouse {
House[] public arrayHouse;
function getHouse(uint n) returns(House){
if (n >= arrayHouse.length)
throw;
return arrayHouse[n];
}
}
Я скомпилировал и перенес контракт ArrayHouse в хранилище testrpc. Затем я перешел к консоли трюфелей и попробовал следующий javascript:
arrayHouse=ArrayHouse.новый(...);
arrayHouse.then (функция (inst1) {meta = inst1; return meta.getHouse (0)}). then (функция (inst2) {return inst2.idHouse.call();})
Я получил следующую ошибку:
TypeError: Cannot read property 'call' of undefined
at evalmachine.<anonymous>:1:84
at process._tickDomainCallback (internal/process/next_tick.js:129:7)
Интересно, почему я не могу получить доступ к атрибуту (public idHouse) элемента (House) моего массива (arrayHouse). У кого-нибудь есть идея?
Только предположение, поскольку я не могу проверить это в данный момент, но, похоже, проблема может быть связана с доступом к вашему контракту. Then() следует использовать для функции, которая будет выполняться после возврата промиса, в то время как вы используете ее для переменной. Попробуйте что-то вроде этого:
ArrayHouse.new({from: accountAddress});
//Or use ArrayHouse.deployed() ArrayHouse.at(accountAddress).getHouse(0).then(function(inst2){return inst2.idHouse.call(); })
getHouse
выдает ошибку, когда n
равно arrayHouse.length
. Вы проходите 0
, а массив пуст, поэтому у вас возникает исключение.
Другое дело, что idHouse
это всего лишь атрибут, поэтому вы не можете вызвать его, как метод.