Truffle-Konsole + Javascript

Ich habe eine Frage an euch. Ich habe 2 Verträge:

contract House { 
  uint public idHouse;
  ...
}

contract ArrayHouse { 
  House[] public arrayHouse;

  function getHouse(uint n) returns(House){
    if (n >= arrayHouse.length) 
      throw;
    return arrayHouse[n];
  }
}

Ich habe den Vertrag ArrayHouse kompiliert und auf das Testrpc-Reseau migriert. Dann ging ich zur Truffle-Konsole und versuchte das folgende Javascript:

  1. arrayHouse=ArrayHouse.new(...);

  2. arrayHouse.then(function(inst1){meta=inst1;return meta.getHouse(0)}).then(function(inst2){return inst2.idHouse.call();})

Ich habe den folgenden Fehler:

TypeError: Cannot read property 'call' of undefined
    at evalmachine.<anonymous>:1:84
    at process._tickDomainCallback (internal/process/next_tick.js:129:7)

Ich frage mich, warum ich nicht auf das Attribut (öffentliches idHouse) eines Elements (Haus) meines Arrays (arrayHouse) zugreifen kann. Hat jemand eine Idee?

Antworten (2)

Ich mache nur eine Vermutung, da ich es im Moment nicht testen kann, aber es scheint, dass die Art und Weise, wie der Zugriff auf Ihren Vertrag das Problem verursacht. Then() sollte für eine Funktion verwendet werden, die ausgeführt wird, nachdem das Promise zurückgegeben wurde, während Sie es für eine Variable verwenden. Versuchen Sie so etwas:

ArrayHouse.new({from: accountAddress});

//Or use ArrayHouse.deployed() ArrayHouse.at(accountAddress).getHouse(0).then(function(inst2){return inst2.idHouse.call(); })

getHousewirft einen Fehler, wenn ngleich ist arrayHouse.length. Sie übergeben 0und das Array ist leer, also wird eine Ausnahme ausgelöst.

Eine andere Sache ist, dass es idHousenur ein Attribut ist, also können Sie es nicht aufrufen, da es eine Methode war.