¿Cómo obtener solo el registro más reciente de mi evento?

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:código

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!

num.watchno escontractInstance.watch

Respuestas (2)

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 fromBlockparámetro al bloque actual agregando el toBlockparámetro al evento.

Vaya, cambié los nombres de las variables y la variable de contrato para la captura de pantalla para que sean más fáciles de entender y escribir mal y puse contractInstance.watch() en lugar de num.watch() En mi código actual que no funciona, estoy usando num.watch () y no el contractInstance. Descubrí que lo que está haciendo tiene sentido, porque lo estoy especificando para ver cualquier registro desde el Bloque 0 hasta el último bloque, y funciona perfectamente la primera vez, luego la segunda vez, etc. Devuelve automáticamente cualquiera que sea la llamada anterior de Oracle. era.
@savard intente fromBlockcomo último... y eliminetoBlock
No entiendo por qué fromBlock: 'latest', toBlock:'latest' no funciona para ver solo la respuesta más reciente/última. Cuando lo uso, nunca reconoce el registro de eventos y se ejecuta para siempre hasta que vuelva a ejecutar la función. Luego, también devuelve la última llamada de Oracle. Sin embargo, gracias por tu respuesta @cmr, esa fue mi culpa. Editaré la captura de pantalla de la pregunta, ¿tiene alguna idea de por qué no 'funcionaría' si estoy usando la sintaxis correctamente? (Técnicamente funciona, pero no como necesito que funcione). ¡Gracias de antemano!
@savard cualquier actualización
sí, acabo de terminar de probar fromBlock: 'latest, toBlock: 'latest' + 1 y ¡funcionó! Creo que porque mi evento regresa de la función Oraclize que devuelve 1 - 2 bloques en el futuro, entonces fromBlock: 'latest' no lo captó. ¡Muchas gracias! He estado luchando con esto durante los últimos 3 días y me inspiraste a probar esa configuración.
@savard También me ayudó a subir de nivel... Gracias.

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.

¿Y cómo obtener todos los eventos aquí si fromBlock: 0, toBlock: "latest" devuelve solo el último evento?