首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >固体事件日志

固体事件日志
EN

Ethereum用户
提问于 2018-08-31 02:47:38
回答 2查看 1.3K关注 0票数 2

我有一个连接到ganache的JS代码。我试图调用一个可靠的函数,在tern中发出这个事件。在JS中,我正在观看活动。现在,当我第一次调用函数时,它会在事件中设置一些值并发出。我在手表里得到了那个价值。但是,当我第二次调用它时,我得到了以前在UI中打印的日志,当前值是在一段时间后出现的。在我的UI中,我只需要由solidity函数设置的当前值,我不需要前面的值。看起来像JS不断轮询手表,在第一次传递时,它打印旧值,最后打印当前值。我希望某些东西只在通过事件发送新值时才起作用。我该怎么做呢。如果您需要更多的信息或代码来查看,请告诉我。

Solidity :-在solidity函数下面发出事件。

代码语言:javascript
复制
function getStudent(string _searchHash) payable public {
      var searchHash = _searchHash;
      university.transfer(msg.value);
      for(uint i=0; i

下面是我监视事件的JS代码:-这里发生的事情是,我能够拿回事件数据。但是它甚至在元问题出现之前就打印了数据,然后我就完成了事务。一旦元data事务完成,它将再次打印数据。这一次,它打印了我想从solidity函数中获得的最新数据。当我得到当前数据时,我正是想要停止加载程序。但是在下面的代码中,我的加载程序在收到实际数据之前就停止了。我只想显示基于给定输入参数的solidity函数正在查找的当前值。但是我得到了以前的所有数据,不知道打印数据的正确时间是什么时候。我是这个技术的新手,所以不确定我的期望是否正确,或者我需要做一些更多的改变。

代码语言:javascript
复制
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();
EN

回答 2

Ethereum用户

发布于 2018-08-31 06:49:39

我认为这里的诀窍是,当页面加载时,您需要首先获得最新的块。然后,当您设置侦听器时,只侦听在该块号之后发生的事件。

就像这样:

代码语言:javascript
复制
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的代码。

如果这有帮助的话请告诉我。

票数 0
EN

Ethereum用户

发布于 2018-08-31 09:02:28

代码语言:javascript
复制
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只是一个全局变量。我所做的另一个改变是删除所有异步并等待关键字。

非常感谢!!

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/57803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档