2017-07-28 6 views
0

Auch mit obwohl dies Astraleum verwandt ist, es ist eigentlich eine Frage JavaScript.Fehler Versprechen in JavaScript

Mein Ziel ist es, eine Funktion zu haben, um einen Ethereum-Vertrag zu implementieren, der seine Adresse zurückgibt, sobald der Vertrag bereitgestellt wird (Nebenbemerkung: Ich bin nicht daran interessiert, ihn mit Mist oder anderen Optionen zu implementieren).

function deploy(contractName, accountOwner, _gas) { 
    // Get the contract code from contracts 
    const input = fs.readFileSync('contracts/' + contractName + '.sol').toString(); 
    const output = solc.compile(input); 
    // The trailing ':' is needed otherwise it crashes 
    const bytecode = output.contracts[':' + contractName].bytecode; 
    const abi = JSON.parse(output.contracts[':' + contractName].interface); 
    const contract = web3.eth.contract(abi); 
    const contractInstance = contract.new({ 
     data: '0x' + bytecode, 
     from: accountOwner, 
     gas: _gas 
    }, sendContract(err, res)); 
    contractInstance.then(console.log(contractInstance), console.log("Failure")); 
} 

function sendContract(err, res) { 
    return new Promise((resolve, reject) => { 
     if (err) { 
      console.log(err); 
      return reject(err); 
     } else { 
      console.log("Transaction Hash: " + res.transactionHash); 
      // If we have an address property, the contract was deployed 
      if (res.address) { 
       console.log('Contract address: ' + res.address); 
      resolve(res); 
      } 
     } 
    }) 
} 

Das funktioniert nicht, weil es ReferenceError: err is not defined zurückgibt. Ich weiß, dass es mit dem Versprechen verwandt ist, aber ich bin nicht sicher, wie es zu beheben, obwohl ich verschiedene Dinge ausprobiert haben. Könnte mich bitte jemand auf den Fehler hinweisen?

Ich weiß, es gibt viele Fragen wie diese hier, aber ich (1) habe sie sowie Versprechen Erklärungen lesen (this one und this one, ua) und (2) sind wirklich stecken und wirklich etwas Hilfe schätzen würde.

+3

Nun, Sie übergeben das Ergebnis des Aufrufs von 'sendContract (err, res)' als zweites Argument zu 'contract.new' ... vielleicht war das einfach gemeint, 'sendContract' ohne das' (err, res) '? –

+0

gleiches Problem mit dem 'console.log's. – Ryan

+0

Siehe auch https://StackOverflow.com/questions/22539815/arent-promises-just-callbacks – Ryan

Antwort

0

This isn't working because it returns ReferenceError: err is not defined.

Sie definieren err als Argument für diese Funktion:

function sendContract(err, res) 

Wie alle Argumente, es ist ein lokal variable dieser Funktion scoped.

Sie versuchen, diese Variable zu verwenden hier:

}, sendContract(err, res)); 

So versuchen Sie AnrufsendContract eine variable errvon außerhalb der Funktion in die lokale Variable mit dem gleichen Namen innerhalb dieser Funktion mit dem Namen übergeben.

Da Sie nicht err außerhalb der Funktion definiert haben, erhalten Sie einen Referenzfehler.

Sie haben das gleiche Problem mit res, aber Sie sehen es nicht, weil die err Version zuerst auslöst.


I know it's related to the promise

Es ist nicht.

+0

Danke für die Antwort. Also sollte ich 'sendContract (err, res)' nur durch 'sendContract' ersetzen? Ich habe das versucht, aber dann habe ich einen Fehler 'Typeerror: contractInstance.then kein function' ist. Wenn nicht, könnten Sie mir bitte zeigen, welche Änderung erforderlich wäre, damit es funktioniert? – mcansado

+0

Es sieht ein Versprechen in 'contract.new' wie vorbei nicht es ein Versprechen zurück. – Quentin

+0

Wahrscheinlich sollten Sie [dies lesen] (https://stackoverflow.com/questions/22519784/how-do-i-convert-an-existing-callback-api-to-promises). – Quentin