Wie man aufhört, alle Vertragsereignisse abzuhören

Ich verwende die JavaScript-API in meinen Truffle-Tests, um die Ereignisse aus dem Vertrag abzurufen: 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);
          });

Es hört nie auf zuzuhören, also habe ich versucht, dies am Ende hinzuzufügen:

          allEvents.stopWatching()

Das Zuhören stoppt, aber es wird nie etwas protokolliert, also habe ich versucht, eine Verzögerung hinzuzufügen:

          setTimeout(allEvents.stopWatching, 1000);

Aber das Zuhören hört nicht auf.

Wie höre ich auf zu hören, nachdem alle bisher ausgegebenen Ereignisse abgerufen wurden?

Welche Version von web3 verwendest du? Welche Bedingung sollte dazu führen, dass das Ansehen aller Ereignisse beendet wird? Wenn Sie .stopWatching()unmittelbar danach aufrufen .watch(), wird es dort vor jedem Ereignis anhalten, setTimeout funktioniert möglicherweise nicht, da allEvents.stopWatchinges sich um eine Funktion ohne Bindung handelt.
web3 Version '0.20.6' in Truffle enthalten. Die Bedingung, die dazu führen sollte, dass es aufhört zuzuschauen, ist, dass es alle vergangenen Ereignisse erhalten hat, aber ich weiß nicht, wie ich das identifizieren soll.

Antworten (2)

1) Die Verwendung von indizierten Parametern, z. B. Adresse oder Ganzzahlen, kann ebenfalls sehr nützlich sein

Beispiel mit ERC20.sol- Prüfung hier Erc20.transfer sollte ausgeben event(address _to, uint256 _amount), was indiziert werden kann, wodurch es einfacher wird, an den Front-End- event Transfer(address indexed _to, uint256 _amount); Vertragsereignissen zu filtern

könnte auf diese Weise geschrieben werden, und Sie erhalten Ereignisse nur von der indizierten Adresse und der indizierten Menge während der Übertragung.

Erc20.events.Transfer({ filter: { _to: recipient, _amount: amount} })
        .on("data", function(event) {
....
        }).on("error", console.error);
      }

Ich hoffe, jemand findet das hilfreich, ich bin auch offen für Korrekturen.

Es besagt, dass Sie stopWatching() nicht aufrufen müssen, wenn Sie eine Callback-Funktion übergeben. Das Problem liegt woanders, also verwerfen Sie einfach die Idee, stopWatching zu verwenden. Könnten Sie stattdessen diese Implementierung versuchen:

const allEvents = instance.allEvents({
        fromBlock: 0,
        toBlock: 'latest'
      });
      allEvents.watch((err, res) => {
        if (!error)
        console.log(res);
      });

Geben Sie mir ein Update

Dasselbe wie zuvor, hört nicht auf zuzuhören