Dapp-Development

我可以將 Metamask 與 promise 非同步呼叫一起使用而不是嵌套回調嗎?

  • May 10, 2017

我正在嘗試使用承諾而不是嵌套回調來提高可讀性。當我使用此程式碼時:

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,我建議您檢查一下!

引用自:https://ethereum.stackexchange.com/questions/16051