¿La mejor manera para que web3 reciba datos del retorno de la función?

Ahora estoy tratando de eliminar mi primera Dapp (usando el complemento Metamask). todo va a estar bien, pero no puedo obtener una cosa: ¿Es posible recibir el retorno de la función, usando Web3 (no JS VM!)

Por ejemplo, tengo un contrato simple como este:

pragma solidity ^0.4.0;

contract test {
    int32 data = 123;

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

Cuando llamo getData()con la máquina virtual JS, funciona bien:

remezclar

Pero con seleccionado Inject web3(Metamask) devuelve información sobre la nueva transacción, en lugar de123

remix_web3

Tampoco puedo recibir ningún dato de la consola JS (Metamask):

ingrese la descripción de la imagen aquí

Parece que el último ejemplo en la consola JS debería funcionar. Tal vez esta pregunta necesita enfocarse en esa parte.
@eth Sí, funciona bien, pero obtengo hash txn en lugar de 123, como se esperaba
Lo siento, leí mal la salida de la consola porque el error no está definido y los datos son nulos. El hash txn se devuelve porque web3 emitió una transacción en lugar de una "llamada" (espero que haya visto la pregunta sobre la diferencia).

Respuestas (2)

Para la pregunta, lo más simple es hacer getData constante como:

function getData() constant returns (int32)

Otra opción es usar un evento: ¿Cómo obtener valores de retorno cuando se llama a la función con argumento?

Agregar constantmodificador solucionó todo, ¡muchas gracias!

¿Intentó usar la función de llamada de forma asíncrona?

contract.getData.call().then(function(result) {
  console.log(result);
});
He tenido bastante éxito al usar Promise.promisifyAll (después de la instanciación del contrato) para que pueda usar valores de retorno reales (Promesas) en lugar de devoluciones de llamada, si los valores de retorno son importantes para usted.