2

我正在通过 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, ...);
                        }
                    }
                })
            }

那可能吗?

我希望有点清楚我的问题是什么以及我想要实现什么。提前致谢

4

0 回答 0