Dapp-Development
我可以將 Metamask 與 promise 非同步呼叫一起使用而不是嵌套回調嗎?
我正在嘗試使用承諾而不是嵌套回調來提高可讀性。當我使用此程式碼時:
balanceUpdate: function() { MyWallet.deployed().then(function(instance) { return web3.eth.getBalance(instance.address); }).then(function(walletBalance) { document.getElementById("walletEther").innerHTML = web3.fromWei(walletBalance).toNumber(); return web3.eth.getBalance(account); }).then(function(accountBalance) { document.getElementById("accountEther").innerHTML = web3.fromWei(accountBalance).toNumber(); }).catch(function(error){ console.error(error); throw "Can't get balances" }) }
Metamask 處於活動狀態時出現此錯誤:
Error: The MetaMask Web3 object does not support synchronous methods like eth_getBalance without a callback parameter. See https://github.com/MetaMask/faq/blob/master/DEVELOPERS.md#dizzy-all-async---think-of-metamask-as-a-light-client for details.
如果我使用嵌套回調它可以正常工作,但我發現它的可讀性要差得多:
balanceUpdate: function() { MyWallet.deployed().then(function(instance) { web3.eth.getBalance(instance.address, function(error, result) { if (error) { console.error(error); } else { document.getElementById("walletEther").innerHTML = web3.fromWei(result.toNumber()); web3.eth.getBalance(account, function(error, result) { if (error) { console.error(error); } else { document.getElementById("accountEther").innerHTML = web3.fromWei(result.toNumber()); } }); // getbalance account } }); // getBalance instance.address }); // MyWallet.deployed }, // balanceUpdate
我在 Metamask 的 github 上發現了這個問題(“Promisify TxManager”) 。不確定是否相關。
任何建議如何避免嵌套回調並能夠同時使用 Metamask?
甚至truffle 網站上的樣本也使用了 Promise。這些樣本是否可能不適用於 Metamask?
MetaMask 和其他 web3 瀏覽器目前註入的 web3 對像不返回 Promise。
您連結的 MetaMask 問題與此無關。
Truffle 有自己的返回 Promise 的 Contract 庫,這適用於 MetaMask 和其他 web3 瀏覽器,這就是它返回 Promise 而純 web3 不返回的原因。
在不久的將來,該
web3
對象本身甚至會被 Mist 和 MetaMask棄用。這就是您會發現的大多數web3 程式碼範例顯示您檢查 web3,然後建議使用其對像初始化您自己的 web3 對象的原因之一web3.currentProvider
。將來,這
provider
將是您用來初始化符合您的程式風格的其他庫的重要的低級部分。您可能會喜歡的一個新的酷庫,它與 MetaMask 一起使用,使用它的提供者,但返回 Promise 是ethjs,我建議您檢查一下!