Search code examples
node.jses6-promiseweb3js

web3js subscribe logs to fast for Javascript to handle


I am using web3js to subscribe to logs, I listening to swap events, the problem is that the .on(data) is so fast in giving data JavaScript can not keep up. lets say I add a variable let count = 0; each time I get a new log I increase the number ++count, sometimes the logs come so fast I get a double number.

The real problem is I need it to be in the exact order as it is coming in, that's why I give the number to each log, but that does not work.

How would I make sure that each data item I get from the log events that they are in order? I tried to create a promise sequence

let sequence = Promise.resolve();
let count = 0;

web3.eth.subscribe('logs', {
 fromBlock: block,
 topics: [
  [swapEvent]
 ]
}).on('data', (logData)=>{
 sequence = sequence.then(()=>{
  ++count
  processData(logData)
 })
});

function processData(){
 return new Promise(resolve=>{
  // do some stuff
  resolve();
 })
};

In a simple test with a loop and random time to resolve this works fine, but in the actual code with socket it does not keep the order. Anyone has some idea how I can make the socket data keep in order and process one by one?


Solution

  • Not sure why but my problem got solved with this.

    sequence = sequence.then(()=>processData(logData))
    

    before it was

    sequence = sequence.then(()=>{
      processData(logData)
    })
    

    Now its doing all in sequence.