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.
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 --blockTime
der Ereignisleser verwirrt und nimmt die Transaktionen nicht richtig auf.
Kurz gesagt, stellen Sie eine --blockTime
von 3+ Sekunden ein und es funktioniert.
Ich weiß nicht, ob es der gleiche Fall ist, aber ich hatte ein ähnliches Problem. Ich habe web3js
mit 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.
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.
Edmund Edgar
Ismael
Enrique Alcázar
Enrique Alcázar