我正在通过 js 中的 web3 与我的 Solidity 合约进行交互,我具有以下功能:
// An investor buys tokens for ether
function buyTokens(account) {
document.getElementById("transaktion").innerText = "Transaction is going to be executed.";
web3.personal.unlockAccount(web3.eth.accounts[account], '******');
contract_instance.buy({from: web3.eth.accounts[account], value: document.getElementById('value').value}, function(error, result) {
if(error) {
console.error(error);
} else {
var txHash = result;
console.log(txHash);
callWhenMined(txHash, getTokenBalance);
}
function callWhenMined(txHash, callback) {
web3.eth.getTransactionReceipt(txHash, function(error, rcpt) {
if(error) {
console.error(error);
} else {
if(rcpt == null) {
setTimeout(function() {
callWhenMined(txHash, callback);
}, 500);
} else {
document.getElementById("transaktion").innerText = "";
callback();
}
}
})
}
// Gets the token balance
function getTokenBalance(id, account) {
document.getElementById(id).innerText = contract_instance.getMyInvestorBalance({from: web3.eth.accounts[account]});
}
如果用户想为以太币购买代币(这在solidity 中是一个非常数函数),则需要挖掘交易。所以函数 buyTokens(account) 调用函数 callWhenMined(txHash, callback) 每 500 毫秒检查一次交易是否被挖掘。当它确实被挖掘时,回调()将被调用,这会导致问题:回调()调用 getTokenBalance(),它需要两个参数(文档元素的 id 和帐号),因此回调函数将失败。但是如果我调用 callWhenMined(txHash, getTokenBalance('testID', 1)); 例如这样我会得到回调不是函数的错误。我确实明白这不会那样工作,因为 callback() 不接受参数。所以我的问题是:有没有办法让函数 callWhenMined 接受需要调用的函数的参数?像这样的东西?
function callWhenMined(txHash, callback(param1, param2, ...)) {
web3.eth.getTransactionReceipt(txHash, function(error, rcpt) {
if(error) {
console.error(error);
} else {
if(rcpt == null) {
setTimeout(function() {
callWhenMined(txHash, callback);
}, 500);
} else {
document.getElementById("transaktion").innerText = "";
callback(param1, param2, ...);
}
}
})
}
那可能吗?
我希望有点清楚我的问题是什么以及我想要实现什么。提前致谢