如何在元遮罩強制非同步呼叫中形成事務對象?
通常,對於合約呼叫(即不更新乙太坊的東西),我會簡單地做:
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()
然後我通過呼叫callHandler
ie簡單地嘗試和複製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) } })
}
…效果很好:)