我有一个连接到ganache的JS代码。我试图调用一个可靠的函数,在tern中发出这个事件。在JS中,我正在观看活动。现在,当我第一次调用函数时,它会在事件中设置一些值并发出。我在手表里得到了那个价值。但是,当我第二次调用它时,我得到了以前在UI中打印的日志,当前值是在一段时间后出现的。在我的UI中,我只需要由solidity函数设置的当前值,我不需要前面的值。看起来像JS不断轮询手表,在第一次传递时,它打印旧值,最后打印当前值。我希望某些东西只在通过事件发送新值时才起作用。我该怎么做呢。如果您需要更多的信息或代码来查看,请告诉我。
Solidity :-在solidity函数下面发出事件。
function getStudent(string _searchHash) payable public {
var searchHash = _searchHash;
university.transfer(msg.value);
for(uint i=0; i下面是我监视事件的JS代码:-这里发生的事情是,我能够拿回事件数据。但是它甚至在元问题出现之前就打印了数据,然后我就完成了事务。一旦元data事务完成,它将再次打印数据。这一次,它打印了我想从solidity函数中获得的最新数据。当我得到当前数据时,我正是想要停止加载程序。但是在下面的代码中,我的加载程序在收到实际数据之前就停止了。我只想显示基于给定输入参数的solidity函数正在查找的当前值。但是我得到了以前的所有数据,不知道打印数据的正确时间是什么时候。我是这个技术的新手,所以不确定我的期望是否正确,或者我需要做一些更多的改变。
async function temp (){
await Student.getStudent(hashCode, function(error, result){
if(!error)
{
console.log('result in callback' + result);
}
else
console.error(error);
});
} //async temp ends.
temp(); // calling temp.
async function getEvent() // function to watch event.
{
var studentEvent = await Student.foundStudentInfo();
eventData = await studentEvent.watch(function(error, result1){
if (!error)
{
if (result)
{
console.log(result1.args);
console.log(result1.blockHash);
$scope.loading = false;
$state.go('result');
}
else
{
console.log(error);
}
}
});
console.log('event data' ||eventData);
}
getEvent();发布于 2018-08-31 06:49:39
我认为这里的诀窍是,当页面加载时,您需要首先获得最新的块。然后,当您设置侦听器时,只侦听在该块号之后发生的事件。
就像这样:
async function getEvent() // function to watch event.
{
var latestblock = 0;
web3.eth.getBlockNumber(function (error, result) {
if (!error) {
latestBlock = result;
}
});
var studentEvent = await Student.foundStudentInfo({fromBlock: latestblock});
eventData = await studentEvent.watch(function(error, result1){
if (!error)
{
if (result)
{
console.log(result1.args);
console.log(result1.blockHash);
$scope.loading = false;
$state.go('result');
}
else
{
console.log(error);
}
}
});您可以看到,我添加了代码以获取最新的块号,并添加了定义要开始侦听事件的fromBlock的代码。
如果这有帮助的话请告诉我。
发布于 2018-08-31 09:02:28
function temp (){
Student.getStudent(hashCode, function(error, result){
if(!error)
{
console.log('result in callback -> ' + result);
}
else
console.error(error);
});
}
temp();
function getEvent()
{
var studentEvent = Student.foundStudentInfo({fromBlock: result.currentBlockNumber});
eventData = studentEvent.watch(function(error, result1){
if (!error)
{
console.log('Block number in event -> '+ result.currentBlockNumber);
if (result1)
{
if (result1.blockNumber > result.currentBlockNumber)
{
console.log(result1.args);
$scope.loading = false;
//
result.currentBlockNumber = result1.blockNumber;
console.log('New block numer -> '+result.currentBlockNumber)
$state.go('result');
//var balance = web3.eth.getBalance(web3.eth.accounts[1]);
//console.log(balance);
//studentEvent.stopWatching();
}
}
}
else
{
console.log(error);
}
});
}
web3.eth.getBlockNumber(function (error, bcNumber) {
if (!error) {
result.currentBlockNumber = bcNumber;
console.log('latestblock -> '+ result.currentBlockNumber);
}
});它没有像您建议的那样起作用,但它确实给了我一些想法,可以围绕它编写更多的代码,以便按我的意愿工作。请检查我的代码以查看更改。If条件if (Result1.block helped > result.currentBlockNumber)帮助我停止重复。result.currentBlockNumber只是一个全局变量。我所做的另一个改变是删除所有异步并等待关键字。
非常感谢!!
https://ethereum.stackexchange.com/questions/57803
复制相似问题