Estoy usando la API de JavaScript en mis pruebas de trufas para obtener los eventos del contrato: https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-allevents
const allEvents = instance.allEvents({
fromBlock: 0,
toBlock: 'latest'
});
allEvents.watch((err, res) => {
console.log(res);
});
Nunca deja de escuchar, así que intenté agregar esto al final:
allEvents.stopWatching()
La escucha se detiene, pero nunca se registra nada, así que intenté agregar un retraso:
setTimeout(allEvents.stopWatching, 1000);
Pero la escucha no se detiene.
¿Cómo dejo de escuchar después de recuperar todos los eventos emitidos hasta ahora?
1) El uso de parámetros indexados, por ejemplo, direcciones o números enteros, también puede ser muy útil.
El ejemplo que usa ERC20.sol aquí Erc20.transfer
debe emitir la verificación event(address _to, uint256 _amount)
que se puede indexar, lo que facilita el filtrado en los event Transfer(address indexed _to, uint256 _amount);
eventos del contrato de front-end
podría escribirse de esta manera, y obtiene eventos solo de la dirección indexada y la cantidad indexada durante la transferencia.
Erc20.events.Transfer({ filter: { _to: recipient, _amount: amount} })
.on("data", function(event) {
....
}).on("error", console.error);
}
Espero que alguien encuentre esto útil, también estoy abierto a la corrección.
Dice que si pasa una función de devolución de llamada, no necesita llamar a stopWatching(). El problema está en otra parte, así que abandona la idea de usar stopWatching. ¿Podría probar esta implementación en su lugar:
const allEvents = instance.allEvents({
fromBlock: 0,
toBlock: 'latest'
});
allEvents.watch((err, res) => {
if (!error)
console.log(res);
});
Dame una actualización
ismael
.stopWatching()
inmediatamente después.watch()
, se detendrá allí antes de cualquier evento, es posible que setTimeout no funcione porqueallEvents.stopWatching
es una función sin enlace.Harsha Laxman