Es wird versucht, Konten als globale Variable zu initialisieren, bevor die Node-Konsole gestartet wird

Grundsätzlich versuche ich, ein Skript auszuführen, das alle Variablen initialisiert, die ich während meiner Node-Konsolensitzung benötige. Das Skript sieht so aus:

global.Web3 = require('web3');
global.web3 = new Web3(new 
Web3.providers.HttpProvider('http://localhost:8545'));

global.Tx = require('ethereumjs-tx');

global.solc = require('solc');

global.accounts;
web3.eth.getAccounts().then(_accounts => {
    accounts = _accounts;
});
require('repl').start({});

Bisher funktioniert alles einwandfrei, bis es an der Zeit ist, die Kontenvariable zu setzen. Das Ausführen und Aufrufen des Skripts erzeugt Folgendes:

➜  ethtest node init.js
> accounts
ReferenceError: accounts is not defined
    at repl:1:1
    at ContextifyScript.Script.runInContext (vm.js:35:29)
    at REPLServer.defaultEval (repl.js:342:29)
    at bound (domain.js:280:14)
    at REPLServer.runBound [as eval] (domain.js:293:12)
    at REPLServer.<anonymous> (repl.js:539:10)
    at emitOne (events.js:96:13)
    at REPLServer.emit (events.js:188:7)
    at REPLServer.Interface._onLine (readline.js:232:10)
    at REPLServer.Interface._line (readline.js:583:8)

Ich bin mir ziemlich sicher, dass ich etwas Einfaches falsch verstehe, aber bisher konnte ich es nicht herausfinden. Jede Hilfe wäre sehr willkommen. Danke!

Antworten (1)

Sie haben eine Rennbedingung, bei der require('repl').start({});Läufe vor accounts = _accounts;Läufen laufen. Dies liegt daran, dass web3.eth.getAccounts()asynchron ausgeführt wird. Was Sie stattdessen haben sollten, ist

web3.eth.getAccounts().then(_accounts => { accounts = _accounts; require('repl').start({}); });