Wie kann man mit web3 testen, ob sich der Benutzer im Mainnet/Testnet befindet?

Hallo zusammen, ich brauche eure schnelle Hilfe!

Ich verwende web3 1.0.0-beta.34 mit React und Next.js und möchte überprüfen, ob der Benutzer Metamask im Mainnet/Rinkeby-Netzwerk festgelegt hat.

Ich habe einige Lösungen gelesen, aber ich habe ein kleines Problem bei der Implementierung.

Grundsätzlich habe ich eine Layout-Komponente, die als Wrapper um alle Elemente dient, also auf jeder Seite aufgerufen wird.

Was ich bisher gefunden habe ist folgendes:

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.')
  }
})

Ich möchte es nicht mit console.log protokollieren, ich möchte es in eine Art Variable einfügen, aber ich kann den React-Zustand nicht verwenden. Um es zu vereinfachen, möchte ich von dieser Funktion nur eine Nummer/String-ID des Netzwerks zurückgeben, in dem sich der Benutzer gerade befindet. Im Moment gibt es mir nur ein Promise-Objekt zurück, und ich weiß nicht, wie ich die ID daraus extrahieren soll.

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

das zeigt es

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

Was ich wirklich brauche, ist dieser [[Promise Value]], der in eine Konstante/Var extrahiert wurde, damit ich ihn manipulieren kann.

Antworten (2)

Dies ist eher eine Frage zur Entwicklung in Javascript im Allgemeinen, also schlage ich das nächste Mal vor, einen anderen geeigneten Kanal für diese Art von Frage zu verwenden.

Mit Web3 führen Sie tatsächlich asynchrone Aufrufe aus .

Sie haben zwei Methoden, um Ergebnisse von asynchronen Aufrufen in Javascript zu erhalten: Callbacks (die altmodische Methode, immer vorhanden) und Promises (eine neuere und sauberere Methode, die noch nicht in allen JS-Bibliotheken verfügbar ist).

Hier ein vollständiges Beispiel für Ihren Fall:

// 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();

Sie können es im Browserspeicher oder in Cookies speichern.