Beste Möglichkeit für web3, Daten von der Funktionsrückgabe zu erhalten?

Jetzt versuche ich, meine erste Dapp zu entwickeln (mit Metamask-Plugin). alles wird gut, aber eines bekomme ich nicht hin: Ist es möglich, mit Web3 (nicht JS VM!)

Ich habe zum Beispiel einen einfachen Vertrag wie diesen:

pragma solidity ^0.4.0;

contract test {
    int32 data = 123;

    function getData() returns (int32) {
        return data;
    }
}

Wenn ich getData()mit der virtuellen JS-Maschine anrufe, funktioniert es einwandfrei:

remixen

Aber mit ausgewählter Inject web3(Metamask) gibt es Informationen über neue Transaktionen zurück, anstatt123

remix_web3

Ich kann auch keine Daten von der JS-Konsole (Metamask) empfangen:

Geben Sie hier die Bildbeschreibung ein

Das letzte Beispiel in der JS-Konsole sieht so aus, als ob es funktionieren sollte. Vielleicht muss sich diese Frage auf diesen Teil konzentrieren.
@eth Ja, es funktioniert gut, aber ich bekomme wie erwartet txn Hash anstelle von 123
Entschuldigung, ich habe die Konsolenausgabe falsch gelesen, da ein Fehler nicht definiert ist und Daten als null vorliegen. Der txn-Hash wird zurückgegeben, da eine Transaktion von web3 anstelle eines "Anrufs" ausgegeben wurde (ich hoffe, Sie haben die Frage gesehen, die nach dem Unterschied fragt).

Antworten (2)

Für die Frage ist es am einfachsten, getData konstant zu machen als:

function getData() constant returns (int32)

Eine andere Möglichkeit ist die Verwendung eines Ereignisses: Wie erhält man Rückgabewerte, wenn eine Funktion mit Argument aufgerufen wird?

Das Hinzufügen constantdes Modifikators hat alles gelöst, vielen Dank!

Haben Sie versucht, die Anruffunktion asynchron zu verwenden:

contract.getData.call().then(function(result) {
  console.log(result);
});
Ich hatte ziemlich guten Erfolg mit Promise.promisifyAll (nach der Vertragsinstanziierung), sodass Sie anstelle von Rückrufen tatsächliche Rückgabewerte (Promises) verwenden können, wenn Rückgabewerte für Sie wichtig sind.