Консоль трюфеля + javascript

У меня есть вопрос к вам, ребята. У меня 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:

  1. arrayHouse=ArrayHouse.новый(...);

  2. 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). У кого-нибудь есть идея?

Ответы (2)

Только предположение, поскольку я не могу проверить это в данный момент, но, похоже, проблема может быть связана с доступом к вашему контракту. 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это всего лишь атрибут, поэтому вы не можете вызвать его, как метод.