Web3js

如何在元遮罩強制非同步呼叫中形成事務對象?

  • June 21, 2017

通常,對於合約呼叫(即不更新乙太坊的東西),我會簡單地做:var something = myContractObject.getSomething().

我剛剛開始使用metamask,不幸的是,它打破了這樣的呼叫不是非同步的抱怨。為什麼?他們總是為我同步返回!那是因為我只使用過testrpc還是專用網路?

無論如何,如果我必須使此類呼叫非同步’,因為我進行了許多此類呼叫,而不是為每個呼叫編寫回調,我正在嘗試編寫一個函式來為我處理這一切。像這樣的東西:

callHandler (_transactionObject) {
 let value = undefined
 this.web3.eth.call( _transactionObject, function(err, result) {
   if (err) {
     console.log(err)
     return undefined
   } else {
     return result
   }
 })
}

這取決於參數_transactionObject。我寫了一個小函式來嘗試形成:

getTransactionObject ( _data ) {
 const account = this.account
 return { from: account, data: _data }
}

這就是我如何呼叫該函式:

const data = myContractObject.getSomething.getData()
var transactionObject = getTransactionObject(data)

var something = myContractObject.getSomething()然後我通過呼叫callHandlerie簡單地嘗試和複製var something = callHandler(transactionObject)

…但這不起作用;似乎myContractObject.getSomething.getData()(我從這裡得到:https ://github.com/ethereum/wiki/wiki/JavaScript-API#contract-methods )沒有返回正確的呼叫數據transactionObject。在這種情況下,我有點卡住了 - 我如何獲得我需要的通話數據並形成正確的transactionObject

附言。我意識到該程式碼還有其他問題,尤其var something = callHandler(transactionObject)是不是非同步的,因此分配給something需要包裝在一些非同步處理程序中……

我沒有使用const data = myContractObject.getSomething.getData()創建一個,而是通過傳入一個回調函式來transactionObject解決這個問題。像這樣的東西:myContractObject.getSomething``callHandler

callHandler( myContractObject.getSomething, callbackFunction )

callHandler看起來像這樣:

callHandler (_func, _cb ) {
_func( function(err, result) {
 if (err) {
   console.log(err)
 } else {
   console.log("got result " + result)
   _cb(result)
 }
})

}

…效果很好:)

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