¿Cómo probar si el usuario está en la red principal/red de prueba usando web3?

Hola a todos, necesito su ayuda rápida!

Estoy usando web3 1.0.0-beta.34 con React y Next.js y quiero verificar si el usuario tiene Metamask configurado en la red principal/rinkeby.

He leído bastantes soluciones, pero tengo un pequeño problema al implementarlas.

Básicamente, tengo un componente de diseño que sirve como contenedor de todos los elementos, por lo que se llama en cada página.

Lo que encontré hasta ahora es esto:

web3.eth.net.getId().then(netId => {
  switch (netId) {
    case 1:
      console.log('This is mainnet')
      break
    case 2:
      console.log('This is the ropsten test network.')
      break
    case 3:
      console.log('This is the kovantest network.')
      break
    case 4:
      console.log('This is the rinkeby network.')
      break
    default:
      console.log('This is an unknown network.')
  }
})

No quiero consolarlo. Iniciar sesión, quiero ponerlo en algún tipo de variable, pero no puedo usar el estado React. Para simplificarlo, todo lo que quiero de esta función es que me devuelva un ID de número/cadena de la red donde se encuentra el usuario en este momento. Por ahora, solo me devuelve un objeto Promise y no sé cómo extraer la ID de él.

var net = web3.eth.net.getId();
console.log(net);

esto es lo que muestra

Promise {<pending>}
__proto__:Promise
[[PromiseStatus]]:"resolved"
[[PromiseValue]]:1

Lo que realmente necesito es este [[Promise Value]] extraído a un const/var para poder manipularlo.

Respuestas (2)

Esta es más una pregunta sobre el desarrollo en Javascript en general, por lo que la próxima vez sugiero usar otro canal adecuado para este tipo de pregunta.

Con Web3, en realidad está ejecutando llamadas asincrónicas .

Tiene dos métodos para obtener resultados de las llamadas asíncronas en Javascript: devoluciones de llamada (el método antiguo, siempre presente) y promesas (un método más nuevo y más limpio, aún no está disponible en todas las bibliotecas JS).

Aquí un ejemplo completo para su caso:

// Utility function
var showNetId = function (netId) {
    console.log("Network ID is", netId)
}

// Callback function: see that error are passed to the function as the first parameter, and the result is the second
var callbackExample = function (error, result) {
    if(error) console.err("There was an error during the call:", error)
    else showNetId(result)
}

// Please note this function is async because I use the "await" command inside
var examples = async function() {

    // To do something just after the promise is fullfilled
    web3.eth.net.getId().then(showNetId)

    // To get the promise and then do something, when the promise is fullfilled
    var promise = web3.eth.net.getId()
    promise.then(showNetId)

    // To get the promise and then, when the promise is fullfilled, assign a variable
    var netId = undefined;
    var promise = web3.eth.net.getId()
    await promise.then((result) => netId = result)
    showNetId(netId)

    // Blocking execution with "await" as if it was a sync call
    var result = await web3.eth.net.getId()
    showNetId(result)

    // Old fashioned callback
    web3.eth.net.getId(callbackExample)

}

examples();

Puede almacenarlo en el almacenamiento del navegador o en las cookies.