Web3js

Web3 + React:交易成功後,嘗試獲取更改狀態但返回舊值?

  • January 14, 2022

我正在嘗試使用 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))

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