即使這與以太坊有關,它實際上是一個JavaScript問題。在JavaScript中使用承諾的錯誤
我的目標是擁有一個部署以太坊合同的功能,一旦合同部署完畢,合同將返回其地址(旁註:我不想用Mist或其他選項部署它)。
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);
}
}
})
}
這不起作用,因爲它返回ReferenceError: err is not defined
。我知道這與承諾有關,但我不知道如何解決這個問題,儘管我嘗試過不同的事情。有人可以請我指出這個錯誤嗎?我知道這裏有很多這樣的問題,但我(1)已經讀過它們以及承諾的解釋(this one和this one等等),以及(2)我真的停留了,並且真的很感謝一些幫助。
好吧,你傳遞調用'sendContract(err,res)'作爲'contract.new'的第二個參數的結果......也許這只是爲了'sendContract'而沒有'(err,res )'? –
與'console.log'相同的問題。 – Ryan
另請參見https://stackoverflow.com/questions/22539815/arent-promises-just-callbacks – Ryan