El objeto MetaMask Web3 no admite métodos sincrónicos sin un parámetro de devolución de llamada [duplicado]

Soy nuevo por aquí y agradecería alguna ayuda intuitiva.

Escribí un contrato e hice una interfaz de usuario para él, y todo funciona bien con ganache-cli. Sin embargo, ahora que lo lancé en Ropsten y en un sitio web real, el código no funciona con MetaMask. Investigué y me di cuenta de que MetaMask necesita parámetros de devolución de llamada, pero después de probar diferentes formas, todavía no he logrado hacerlo bien.

mi código es:

   $("#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'});
    })

El error que estoy recibiendo es:

Error no detectado: el objeto MetaMask Web3 no admite métodos sincrónicos como eth_sendTransaction sin un parámetro de devolución de llamada.

¿Cómo debo configurar mis parámetros de devolución de llamada para las funciones anteriores?

PD: soy nuevo en la programación, así que disculpe los posibles errores con el código.

Gracias de antemano.

Respuestas (2)

Eche un vistazo a esta solución como una respuesta a su problema.

La idea general es que está intentando realizar una llamada síncrona y espera recibir una promesa. Los documentos lo explican muy claramente y proporcionan un ejemplo.

Eche un vistazo al siguiente ejemplo:

web3.eth.getBlock(48, function(error, result){
    if(!error)
        console.log(JSON.stringify(result));
    else
        console.error(error);
})
Lo comprobé y, usando el código anterior como ejemplo, logré sincronizar con MetaMask. Sin embargo, ahora llama automáticamente a la función tan pronto como cargo el sitio web, en lugar de hacer clic en el botón. ¿Alguna sugerencia?

Está resuelto. El comentario de @shanefontaine y esta fueron las principales fuentes de ayuda. En cuanto a por qué las funciones se llamaron automáticamente cuando se cargó el sitio web, fue un error de sintaxis de mi parte. La función de JavaScript se invocaba a sí misma y, por lo tanto, llamaba a la función de contrato automáticamente. El código final se ve así para un botón + función:

$("#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);    
}) })

Gracias por la ayuda.