Cómo dejar de escuchar todos los eventos del contrato

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?

¿Qué versión de web3 estás usando? ¿Qué condición debería hacer que deje de ver todos los eventos? Si llama .stopWatching()inmediatamente después .watch(), se detendrá allí antes de cualquier evento, es posible que setTimeout no funcione porque allEvents.stopWatchinges una función sin enlace.
web3 Versión '0.20.6' incluida en Truffle. La condición que debería causar que deje de mirar es que obtuvo todos los eventos pasados, pero no sé cómo identificar eso.

Respuestas (2)

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

Igual que antes, no deja de escuchar