Solidity

呼叫太快時事件不會觸發

  • June 26, 2018

我有一個非常簡單的 Solidity 函式,它只呼叫一個事件:

    function sendMessage(int id, string title, string message){
      Message(id, method, parameters);
    }

當我使用 web3 呼叫它時:

communicationChannelInstance.sendMessage(45, 'exampleTitle', '{}');

我可以用事件手錶看到它就好了。

當我在循環中多次呼叫該函式時,問題就來了:

     ids.forEach(function(id) {
       communicationChannelInstance.sendMessage.sendTransaction(id, 'exampleTitle', '{}');
     })

不管這個循環被呼叫多少次,它只顯示最新的事件。

這是我正在使用的手錶:

var events = contractInstance.allEvents();
 events.watch(function(error, event){
     if (error) {
       callback(error, null);
     } else {
        var eventRet = event;
       callback(null, eventRet);
     }
 });

為什麼會這樣?我怎樣才能真正快速地觸發多個事件並執行所有事件?

謝謝您的幫助。

解決了它,這是 Ganache/testRPC 和 web3 的問題,如果它設置為在獲得交易後立即探勘交易,而不是使用標誌來探勘塊--blockTime,事件閱讀器會感到困惑並且無法正確獲取交易。

簡而言之,將 a 設置--blockTime為 3+ 秒就可以了。

我不知道是不是同樣的情況,但我遇到了類似的問題。我web3jsMetaMask. 當我使用此功能記錄事件時

mycontract.MyEvent({fromBlock:0, toBlock: 'latest'}, function(error, log){...});,

它只顯示最新事件;相反,使用

mycontract.allEvents({fromBlock:0, toBlock: 'latest'}, function(error, log){
  if (!error){
      if(log.event == "Message"){
           console.log(log.args.id);
           console.log(log.args.method);
           console.log(log.args.parameters);
      }
  }
});

它顯示了一切。

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