实体事件未调用

时间:2018-11-12 18:44:03

标签: javascript blockchain ethereum solidity smartcontracts

我正在尝试在前端监视事件,但是有一个错误正在挡住。

这是JS在监视事件

import web3 from './web3';

export async function callEvent () {
  await Contract.events.PracticeEvent().watch((response) => {
    console.log('the event has been called', response);
  }).catch((err) => {
    console.log(err);
  })

   await Contract.triggerEventFunc().call();
} 

合同代码:

event PracticeEvent (string _message, uint _timestamp);

function checkEvent() public {
    emit PracticeEvent("event has been called", gts);
}

--- web3.js文件

import Web3 from 'web3';

const web3 = new Web3(window.web3.currentProvider);

export default web3;

因此,当我运行该应用程序时,我会看到一条错误消息

“未捕获(承诺)TypeError:Contract.default.events.PracticeEvent(...)。watch不是函数”

这一切在Remix中都可以正常工作,但是当我尝试在实际应用中运行它时就会搞砸

我假设该错误与web3有关,但我不确定为什么,因为web3的东西在我的其他应用程序中都可以正常工作。

有帮助吗?谢谢!

1 个答案:

答案 0 :(得分:2)

事件只能在事务内部发出。您正在执行.call(),该操作仅从区块链读取数据,并且无法发出事件。

如果您希望函数发出事件,则应替换

await Contract.triggerEventFunc().call();

使用

await Contract.triggerEventFunc().sendTransaction();

这会将交易发送到区块链,并且将花费以太币发送。在此事务内,可以发出一个事件,因此您应该能够使用web3捕获它。