Actualmente estoy usando Oraclize en mi contrato y realizo una llamada a una función de contrato desde mi front-end y no quiero continuar con la próxima llamada hasta que la función de Oraclize haya regresado. Así que decidí usar un evento con un filtro, y funciona perfectamente la primera vez, luego en las próximas llamadas en realidad no espera a que la función de Oraclize regrese nuevamente, simplemente toma el valor de retorno de la función de Oraclize anterior y usa eso porque está usando el evento registrado anterior y no está esperando el más nuevo.
Esto me lleva a preguntarme por qué mi filtro está escuchando/utiliza el evento emitido desde el contrato inteligente en la última llamada, en lugar de esperar a que se llame al nuevo evento. Más tarde devuelve el nuevo valor de Oraclize si no uso myEvent.stopListening() para que sepa que Oraclize sigue funcionando después de la primera llamada.
Mi pregunta es ¿cómo solo escuchas/reaccionas al último evento? En este momento, está tomando cualquier evento que se disparó antes y se activa a partir de eso.
Aquí está mi código front-end viendo el evento:
También he intentado usar varias combinaciones para el filtro, como: {fromBlock: 'latest', toBlock:'latest} o {fromBlock: 'latest'}
ninguno de los dos funciona en absoluto, nunca se activan la primera vez, luego, si vuelvo a llamar a la función, tienen el mismo problema y se activan instantáneamente en el evento registrado anterior.
¿Puede alguien explicarme qué hace 'más reciente', porque parece que no entiendo bien? Además, si esto hace alguna diferencia, mi llamada de evento en mi contrato inteligente se lleva a cabo en __callback() de Oraclize, y mi código de visualización frontal se coloca en una devolución de llamada donde el usuario hace clic en un botón e ingresa un número y envía la transacción. ¿La ubicación dentro de una función de devolución de llamada está causando este extraño error?
Gracias por cualquier ayuda o comprensión, revisé la documentación sobre eventos de contrato y web3.eth.filters pero no pude resolver esto. Lo siento por la enorme pared de texto.
TL: DR ¿Cómo logra que su reloj () solo busque nuevos registros de eventos, no reaccione a los registros de eventos anteriores que se activaron? ¡Gracias!
Modifique el código de la siguiente manera:
var num=contractInstance.Result({},{fromBlock: 0, toBlock: 'latest' });
num.watch(function(error,result){
});
Aquí estamos recuperando los eventos del bloque 0 y eso se hace agregando un fromBlock
parámetro al bloque actual agregando el toBlock
parámetro al evento.
fromBlock
como último... y eliminetoBlock
Si va a obtener eventos del 0 al último , siempre obtendrá todos los eventos que han ocurrido. Si ha comprometido datos anteriormente y simplemente inicia el reloj desde y hacia Bloques, verá que pronto obtendrá todo lo que se comprometió.
prueba esto:
var event = conInst.YourEventName({},{
fromBlock:'latest',
toBlock:'pending'},
function(error, result) {
if (!error)
console.log(result.args);
});
Esto le dará los datos que están a punto de ser extraídos. El problema con esto es que probablemente no tenga todos los registros todo el tiempo (dependiendo de quién esté interactuando con su contrato inteligente). Pero seguramente le brinda lo más temprano que está a punto de ingresar a la cadena de bloques.
Otra forma de hacer esto a modo de prueba completa es filtrarlos internamente. Digamos que tiene una asignación de una ID a una estructura, ahora para una ID modificó algunos datos, ahora obtendrá tanto la antigua como la nueva para esa misma ID. Entonces, lo que puede hacer es pasar el "número de bloque" en el evento, de modo que cuando obtenga los registros, lo recorra y solo vea si para la misma ID tiene varios, toma el número de bloque más alto.
Así es como yo lo hago, pero es lento. Puedes pasar de otra manera, pero entiendes la idea.
crissi mariam robert
num.watch
no escontractInstance.watch