MetaMask Web3-Objekt unterstützt keine synchronen Methoden ohne Callback-Parameter [duplizieren]

Ich bin neu hier und würde mich über intuitive Hilfe freuen.

Ich habe einen Vertrag geschrieben und eine Benutzeroberfläche dafür erstellt, und mit Ganache-Cli funktioniert alles einwandfrei. Jetzt, wo ich es auf Ropsten und auf einer tatsächlichen Website gestartet habe, funktioniert der Code jedoch nicht mit MetaMask. Ich habe meine Nachforschungen angestellt und festgestellt, dass MetaMask Rückrufparameter benötigt, aber nachdem ich verschiedene Möglichkeiten ausprobiert habe, habe ich es immer noch nicht geschafft, es richtig zu machen.

Mein Code ist:

   $("#button1").click(function(resolve, reject) {
       address =  account.toString(); 
       MyContract.function1({from: address, value: '1000000000000000000'});
    })

    $("#button2").click(function(web3) {
       address =  account.toString();  
       var spender = $("#useraddress")[0].value;
       MyContract.function2(spender, "1", {from: address});
    })

    $("#button3").click(function (web3) {
       address =  account.toString(); 
       var tokenreceiver = $("#newowner")[0].value;
       MyContract.function3(tokenreceiver, "1", {from: address});
    })

    $("#button4").click(function(web3) {
       address =  account.toString(); 
       MyContract.function4({from: address, value: '0', gas: >'3000000'});
    })

Der Fehler, den ich bekomme, ist:

Nicht erfasster Fehler: Das MetaMask-Web3-Objekt unterstützt keine synchronen Methoden wie eth_sendTransaction ohne Callback-Parameter.

Wie soll ich meine Callback-Parameter für die obigen Funktionen einstellen?

PS Ich bin neu in der Programmierung, also entschuldigen Sie bitte mögliche Fehler mit dem Code.

Vielen Dank im Voraus.

Antworten (2)

Sehen Sie sich diese Lösung als Antwort auf Ihr Problem an.

Die allgemeine Idee ist, dass Sie versuchen, einen synchronen Anruf zu tätigen und erwarten, eine Zusage zu erhalten. Die Dokumentation erklärt es sehr deutlich und liefert ein Beispiel.

Schauen Sie sich das folgende Beispiel an:

web3.eth.getBlock(48, function(error, result){
    if(!error)
        console.log(JSON.stringify(result));
    else
        console.error(error);
})
Ich habe es mir angesehen und den obigen Code als Beispiel verwendet, um die Synchronisierung mit MetaMask zu erreichen. Allerdings ruft es die Funktion jetzt automatisch auf, sobald ich die Website lade, statt auf Knopfdruck. Irgendwelche Vorschläge?

Es ist gelöst. Der Kommentar von @shanefontaine und dies waren die Hauptquellen der Hilfe. Warum Funktionen beim Laden der Website automatisch aufgerufen wurden, war ein Syntaxfehler von meiner Seite. Die JavaScript-Funktion war selbstaufrufend und rief daher die Vertragsfunktion automatisch auf. Der endgültige Code sieht für eine Schaltfläche + Funktion so aus:

$("#button").click(function(web3) {     
 var tx = MyContract.function(parameter1, parameter2, {  
  from: address,   
  gas: "300000",   
  to: "CONTRACTADDRESS",   
  value: "0",   
  data: "" }, 
function(err, transactionHash) {  
   if (!err)
console.log(transactionHash);    
}) })

Danke für die Hilfe.