¿Qué sucede cuando usamos "devolución de llamada" en una función? y ¿cuándo necesitamos usarlo?

¿Qué sucede cuando usamos " callback" como palabra clave en una función? ¿Y cuándo debemos usarlo? y ¿qué pasa si no lo usamos? Por ejemplo, en el siguiente código JavaScript:

function signPayment(recipient, amount, nonce, contractAddress, callback) {
  var hash = "0x" + ethereumjs.ABI.soliditySHA3(
    ["address", "uint256", "uint256", "address"],
    [recipient, amount, nonce, contractAddress]
  ).toString("hex");

  web3.personal.sign(hash, web3.eth.defaultAccount, callback);
}

Respuestas (2)

La devolución de llamada básicamente es una función que se pasa a otra función y se ejecuta allí cuando llama a esta "devolución de llamada". Se puede encontrar un ejemplo muy simple en los documentos de mozilla .
Si no pasa ninguna devolución de llamada, dependiendo del código de función, puede o no afectar su programa, ya que la devolución de llamada será nula.

Algunos métodos web3 son asíncronos y requieren una devolución de llamada.

La función de devolución de llamada se ejecuta una vez que se realiza la función original y toma un hash de transacción o similar como argumento.

Puede evitar las devoluciones de llamada por completo mediante el uso de un patrón async/await.

Por ejemplo:

async function signPayment(recipient, amount, nonce, contractAddress) {
  var hash = "0x" + ethereumjs.ABI.soliditySHA3(
    ["address", "uint256", "uint256", "address"],
    [recipient, amount, nonce, contractAddress]
  ).toString("hex");

  var signed = await web3.personal.sign(hash, web3.eth.defaultAccount);
  console.log(signed);
}
@async @Maxpeinas Gracias. ¿Hay alguna ventaja para cada uno de los enfoques: callbackvs. async? Gracias
async todavía hace una devolución de llamada bajo el capó, por lo que no hay diferencia, excepto que usar async hace que su código sea más simple
Vea esto para una comparación entre async/await y callbacks: stackoverflow.com/questions/46336029/…
Gracias. Simplemente, necesito ejecutar este código JavaScript para firmar un pago mediante la función signPayment (el código completo está aquí ). Por lo tanto, guardé el código JavaScript en un .jsarchivo (puede ver el contenido de este .jsarchivo aquí ). Sin embargo, cuando ejecuto este archivo, node filename.jsrecibo el mensaje de error que indica que cargué la captura de pantalla aquí . No sé dónde me estoy equivocando. Gracias de nuevo.
@sas Echa un vistazo a esta esencia: gist.github.com/Kaisle/bece5cbdcac17385d2f8e0cfa7c6b095 . Simplemente reemplace los argumentos con los argumentos de su código (e ignore el argumento de devolución de llamada, no lo necesita)
Gracias, ahora recibo un error relacionado con ethereumjs-abi. Aquí está el contenido del archivo que ejecuto. Y aquí está el mensaje de error que recibo. Por cierto, cuando quiero instalar ethereumjs-abilo que se usa en este código, recibo este mensaje . No estoy seguro de si está bien instalado. Gracias
¿Ha incluido la dependencia en su archivo usando require('ethereumjs-abi') o similar?
Gracias, sí, lo había olvidado... pero ahora agregué var abi = require('ethereumjs-abi')en la parte superior del código ([AQUÍ]( ibb.co/imjwPy )). Sin embargo, recibo el mismo error ([AQUÍ]( ibb.co/bWvWrd )) Gracias
intente lo siguiente: var ethereumjs = require('ethereumjs-abi');
Bueno, ahora se reconoce ... pero recibo un nuevo error: [AQUÍ] ( ibb.co/jZbonJ ) ( soliditySHA3) Gracias de nuevo
prueba sin ABI: ethereumjs.solidityShA3
Gracias, solucionado pero uno nuevo... espero que sea el último.... AQUÍ ( sign) También agregué Web3 = require("web3")y web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));Gracias de nuevo
Usé web3.eth.personal.signen lugar de web3.personal.signy signestá resuelto, pero el nuevo error está AQUÍ: ibb.co/gAG2gd Gracias de nuevo
no es por web3.eth.defaultAccount? No necesitamos iniciar defaultAccountel valor? Gracias