当一个事件(某件事)在契约中被触发时,页面控制台(通过somethingEvent.watch())会按预期记录输出,但是当我重新加载页面时,它会记录相同的输出。最近的事件是否意味着持续存在,还是我没有正确地使用它?
// Solidity
event Something(string message);
function doSomething(string newMessage) payable {
Something(newMessage);
}
// Web3
var somethingEvent = contractInstance.Something();
somethingEvent.watch(function(error, result) {
console.log(result.args.message);
});发布于 2018-01-20 23:34:00
每当您调用watch()时,都会发生这种情况,并且最新的块号与上一次执行相同。当事件被“触发”时,EVM所做的就是在事务被成功挖掘后将事件信息写入日志。
将手表添加到合同中时,可以指定要开始侦听的块。如果您没有传递任何内容(正如您的代码所做的那样),它默认为最新的块(请参见过滤器API文档)。因此,当您重新加载页面,而新的块尚未添加到链中时,您将得到相同的事件。
如果希望避免重复事件,请使用result.blockNumber来记住最后一个块读取,并在建立新手表时将其增加1。
let blockNumber = 'latest'; // should come from some state initially set to 'latest'
...
var somethingEvent = contractInstance.Something({}, {fromBlock: blockNumber);
somethingEvent.watch(function(error, result) {
blockNumber = result.blockNumber + 1;
console.log(result.args.message);
});请注意,在这种情况下,使用watch可能不是最好的选择。这取决于你的客户的状态如何。在监听完事件后,您应该始终调用stopWatching。如果您不想设置一个手表,您也可以使用get,它将发送所有符合筛选条件的事件。
https://stackoverflow.com/questions/48361899
复制相似问题