Ereignisse werden nicht ausgelöst, wenn sie zu schnell aufgerufen werden

Ich habe eine sehr einfache Soliditätsfunktion, die nur ein Ereignis aufruft:

     function sendMessage(int id, string title, string message){
       Message(id, method, parameters);
     }

Wenn ich es mit web3 aufrufe:

communicationChannelInstance.sendMessage(45, 'exampleTitle', '{}');

Ich kann es mit einer Ereignisuhr gut sehen.

Das Problem tritt auf, wenn ich diese Funktionen mehrmals innerhalb einer Schleife aufrufe:

      ids.forEach(function(id) {
        communicationChannelInstance.sendMessage.sendTransaction(id, 'exampleTitle', '{}');
      })

Unabhängig davon, wie oft diese Schleife aufgerufen wird, zeigt sie nur das letzte Ereignis an.

Dies ist die Uhr, die ich verwende:

var events = contractInstance.allEvents();
  events.watch(function(error, event){
      if (error) {
        callback(error, null);
      } else {
         var eventRet = event;
        callback(null, eventRet);
      }
  });

Warum passiert das? Wie kann ich mehrere Ereignisse wirklich schnell auslösen und alle ausführen?

Danke für die Hilfe.

Können Sie uns den tatsächlichen Fehlercode zeigen, dh mit der Uhr usw.?
Sind Sie sicher, dass alle Transaktionen ausgeführt wurden? Auch mit wie vielen Transaktionen haben Sie gearbeitet?
Alle Transaktionen werden ausgeführt, wenn ich nach allen Ereignissen suche, sehe ich sie alle, aber wenn ich nach den neuesten suche und die Ereignisse ohne Wartezeit auslöse, bekomme ich nur das neueste Ereignis.
@Ismael Dies geschieht mit nur 2 Ereignissen im Foreach, und alle Transaktionen wurden ausgeführt, ich kann sie sehen, wenn ich alle ausgelösten Ereignisse abfrage, ich kann sie einfach nicht in Echtzeit sehen

Antworten (2)

Gelöst, es ist ein Problem mit Ganache/testRPC und web3, wenn es so eingestellt ist, dass Transaktionen abgebaut werden, sobald sie sie erhalten, anstatt das Flag zu verwenden, um Blöcke abzubauen, wird --blockTimeder Ereignisleser verwirrt und nimmt die Transaktionen nicht richtig auf.

Kurz gesagt, stellen Sie eine --blockTimevon 3+ Sekunden ein und es funktioniert.

Ich weiß nicht, ob es der gleiche Fall ist, aber ich hatte ein ähnliches Problem. Ich habe web3jsmit verwendet MetaMask. Wenn ich diese Funktion verwendet habe, um Ereignisse zu protokollieren

mycontract.MyEvent({fromBlock:0, toBlock: 'latest'}, function(error, log){...});,

es zeigt nur das letzte Ereignis; stattdessen verwenden

mycontract.allEvents({fromBlock:0, toBlock: 'latest'}, function(error, log){
   if (!error){
       if(log.event == "Message"){
            console.log(log.args.id);
            console.log(log.args.method);
            console.log(log.args.parameters);
       }
   }
});

es zeigt alles.

Ihr System zeigt bei der Ausführung alle Nachrichten an. Was ich nicht verstehe, ist, warum, wenn ich das System zuerst ausführe, gefolgt von der Schleife – es liest nur das letzte ausgelöste Ereignis, nicht alle, aber wenn ich das System nach der Schleife ausführe – zeigt es alle Ereignisse an.
Aus der Dokumentation github.com/ethereum/wiki/wiki/JavaScript-API#contract-events var myEvent = myContractInstance.MyEvent({some: 'args'}, {fromBlock: 0, toBlock: 'latest'}); var myResults = myEvent.get(function(error, logs){ ... }); erhalten Sie alle vorhandenen Ereignisse und myEvent.watch(function(error, result){ ... });erhalten Sie nur die letzten.
@Ismael Ich habe beide verwendet, wenn ich versuche, die letzten zu bekommen, wenn mehrere Ereignisse sehr nahe beieinander gefeuert werden, zeigt das zweite, das Sie verwendet haben, nur das neueste, wenn ich zum Beispiel zwischen jedem Ereignisfeuer 5 Sekunden warte , es zeigt sie alle.