¿Cómo puedo evitar que las llamadas a la función web3 impriman la Promesa? Solo quiero que se imprima el valor real

Estoy usando node.js para ejecutar un script de JavaScript simple que prueba el acceso a la cadena de bloques rinkeby usando un punto final de infura. en concreto, está consultando el saldo de mi domicilio.

En el código si invoco:

console.log(web3.eth.getBalance(address));

solo devuelve la Promesa, es decir

Promise {
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined }

Si por el contrario llamo:

console.log(web3.eth.getBalance(address, function (error, result) { }));

devuelve tanto la Promesa como el saldo de la dirección, es decir.

Promise {
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined }
18750000000000000000

Realmente no entiendo por qué imprime la Promesa en absoluto. Simplemente quiero que devuelva el valor solo, es decir, 18750000000000000000

¿Cómo puedo lograr esto y realmente necesito especificar el function (error, result) { }parámetro opcional para todas las llamadas a la función web3 solo para que me devuelva los datos que necesito?

gracias

Respuestas (2)

intente con algo a lo largo de las líneas de:

const get_eth_balance = async (web3, account) => {

  const balance = await web3.eth.getBalance(account);

  return balance;
};

get_eth_balance(web3, account);

Las palabras clave principales aquí son async/await , que hacen que el código parezca mucho más sensato de lo que sería mediante el uso de devoluciones de llamada.

en primer lugar, gracias por su pronta e informativa respuesta: su código solo sirve para imprimir: "obteniendo el saldo de la cuenta: [objeto Promesa]" no el valor real que espero. ¿Me estoy perdiendo algo más aquí? Además, ¿el enfoque async/wait significa que puedo prescindir de la sintaxis Promise.then() mucho más detallada y difícil de leer?
sí, también puedes usarlo comoweb3.eth.getBalance(account).then( balance => {console.log(balance)} )

Si no recuerdo mal, la versión web3 actual (v1.0) no admite operaciones sincrónicas. Si desea funciones síncronas (sin promesas o async/await), puede instalar la versión anterior haciendo lo siguiente:

npm install web3@0.20

const Web3 = require('web3')
const web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby.infura.io'))
const address = '0x966e42aA4E7368818517a93656362C30d8E4d5fE'
const balance = web3.eth.getBalance(address)
console.log(balance.toNumber())