Truffle

如何停止監聽合約的所有事件

  • February 17, 2020

我在松露測試中使用 JavaScript API 從契約中獲取事件: 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);
         });

它永遠不會停止聽,所以我嘗試將其添加到末尾:

         allEvents.stopWatching()

收聽停止,但沒有記錄任何內容,所以我嘗試添加延遲:

         setTimeout(allEvents.stopWatching, 1000);

但傾聽並沒有停止。

在檢索到到目前為止發出的所有事件後,如何停止收聽?

  1. 使用索引參數,例如地址或整數也非常有用

此處使用 ERC20.sol檢查的 Erc20.transfer範例應該發出event(address _to, uint256 _amount)可以被索引的內容,從而更容易在前端 event Transfer(address indexed _to, uint256 _amount); 合約事件中進行過濾

可以這樣寫,並且在傳輸過程中您只能從索引地址和索引金額中獲取事件。

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

我希望有人覺得這有幫助,我也願意更正。

它說如果你傳遞一個回調函式,你不需要呼叫 stopWatching()。問題出在其他地方,所以放棄使用 stopWatching 的想法。你可以試試這個實現嗎:

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

給我一個更新

引用自:https://ethereum.stackexchange.com/questions/58856