1.玄学
我在以太坊的合约是代币合约,其中包含有转币的方法transfer,用来把自己或其他人的代币转来转去,代币和扇贝一样也是要活动活动滴哈哈哈(獐子岛扇贝事件)。
我一开始使用用来监听合约中Transfer事件的代码如下:
await this.contract.events.Transfer()
.on('data', function (event) {
_this.sendAlertIcon = 'success'
_this.sendAlert = '发送成功'
_this.sendAlertShow = true
_this.initBalance()
})
.on('changed', function (event) {
_this.sendAlertIcon = 'error'
_this.sendAlert = '发送失败,交易被中断'
_this.sendAlertShow = true
// remove event from local database
})
.on('error', () => {
_this.sendAlertIcon = 'error'
_this.sendAlert = '发送失败,请重试'
_this.sendAlertShow = true
})
上面的代码中,data我的理解是整个代币发送成功之后触发的事件,里面的代码是对每个事件的反应,就好像发送成功了就要告诉他厉害呀牛逼呀欢呼呀成功啦哈哈哈,后面两个事件还没有仔细的看,粗略理解,changed事件是把代币从发送pending状态移除之后所触发的事件,removed为true,error是发生错误的时候所触发的事件,有不对的地方望大家指出来。
那么下面重点来了,我发现接不接受的到事件全凭MetaMask心情,哦对了,我这个地方web3连接的是MetaMask的网络哈哈。
2.偶然的发现
一个巧合我发现监听事件中有个参数好像有点用,我改改了,变成下面样子:
await this.contract.events.Transfer({
fromBlock: 0,
toBlock: 'latest'
})
.on('data', function (event) {
_this.sendAlertIcon = 'success'
_this.sendAlert = '发送成功'
_this.sendAlertShow = true
_this.initBalance()
})
.on('changed', function (event) {
_this.sendAlertIcon = 'error'
_this.sendAlert = '发送失败,交易被中断'
_this.sendAlertShow = true
// remove event from local database
})
.on('error', () => {
_this.sendAlertIcon = 'error'
_this.sendAlert = '发送失败,请重试'
_this.sendAlertShow = true
})
没错就是加上了fromBlock和toBlock就可以解决了,监听妈妈再也不用担心我了。