当在合同中触发事件(Something)时,页面控制台会按预期(通过somethingEvent.watch())记录输出,但是当我重新加载页面时,它会记录相同的输出。最近的事件是持续存在还是我没有正确使用它?感谢。
// Code
import { SafeAreaView } from 'react-native';
<SafeAreaView style={styles.safeArea}>
...
</SafeAreaView>
// Style
safeArea: {
flex: 1,
backgroundColor: colors.background,
},
答案 0 :(得分:3)
只要您调用watch()
并且最新的块编号与上一次执行相同,就会发生这种情况。当一个事件被解雇时,所有EVM正在做的是在事务成功挖掘后将事件信息写入日志。
将合约添加到合约时,您可以指定要开始监听的合约。如果您没有传递任何内容(正如您的代码所做的那样),则默认为最新的块(请参阅filter API docs)。因此,当您重新加载页面并且未将新块添加到链中时,您将获得相同的事件。
如果您想避免重复事件,请使用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
,它会发回符合您的过滤条件的所有事件。