Web3js
Web3 + React:交易成功後,嘗試獲取更改狀態但返回舊值?
我正在嘗試使用 React 做一些非常簡單的事情,但我不明白髮生了什麼。
const A = await myContract.getA() // A = 0 myContract .setA(1) // should set A = 1 => confirmed by blockExplorer! .then(tx => tx.wait()) .then(async () => { const a = await myContract.getA() // A = 0! }) .catch()
如果我在 之後立即刷新頁面
tx.wait()
,那麼第一條語句返回 A = 1 / 表示 tx 成功並且狀態已更改,那麼為什麼 tx 之後獲取的狀態是舊狀態?還添加了一個 setTimeout 像 10 秒,以確保這不是問題……
想法???謝謝
編輯: 創建一個
setInterval
以每秒不斷呼叫契約。最終,狀態會更新,但這需要很長時間。任何想法為什麼在使用元遮罩時需要很長時間才能改變狀態?如果我呼叫
@truffle/hdwallet-provider
用於獲取狀態的伺服器,更改幾乎會立即反映!
當連結 Promise 時,每個 then 都必須返回一個 Promise 以供後續 then 順序進行。
但是,在您的程式碼中,兩個 then 方法都在偵聽 setA 返回的相同承諾。因此,它們不會按順序執行。請查看有關連結承諾如何工作的解釋以獲得清晰的圖片。https://javascript.info/promise-chaining
正如@bluebunny 建議的那樣,連結
tx.wait
是解決問題的正確方法
您可能會更成功地將第二次
.then
呼叫連結到tx.wait()
- 這樣,第二次then()
肯定會觸發 /after/ 事務已確認,而不是可能之前。IE。,
(txn => txn.wait(1).then(do stuff))