首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一个事件触发动作多次使用useEffect和Ethers.js

同一个事件触发动作多次使用useEffect和Ethers.js
EN

Ethereum用户
提问于 2023-01-19 14:13:17
回答 1查看 59关注 0票数 0

我正在尝试侦听智能契约事件,但我的事件侦听器在每个事件中被触发不止一次。

事件将被发出,并返回两个字符串。该事件被声明为event UpdatedMessages(string oldStr, string newStr);,并且不存在任何问题。

我试图使用与Ethers.js事件触发问题相同的解决方案,但没有成功。

代码的相关部分是

代码语言:javascript
复制
  let [provider, setProvider] = useState(null)
  let [contract, setContract] = useState("");
  let [network, setNetwork] = useState("");
  let [signer, setSigner] = useState(null)

  const loadBlockchainData = async () => {
    provider = new ethers.providers.Web3Provider(window.ethereum)
    setProvider(provider)
    network = await provider.getNetwork()
    setNetwork(network)
    //const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' })
    //setAccount(accounts[0])

    signer = provider.getSigner();
    setSigner(signer)

    // Javascript "version" of the smart contracts
    contract = new ethers.Contract(config[network.chainId].helloWorld.address, HelloWorld, signer)
    setContract(contract)

  }

  const addSmartContractListener = async () => {
    if (network) {
      provider.once("block", () => {
        contract.on("UpdatedMessages", (old, data)=>{
          console.log(old, data)
        })
      })
    }
  }

  useEffect(() => {
    addSmartContractListener();
    loadBlockchainData();
  }, [])

知道我错过了什么吗?

该项目可在我的GitHub at https://github.com/Benjovengo/event-listener上使用。

EN

回答 1

Ethereum用户

发布于 2023-01-27 23:24:09

下面的代码解决了我的问题。

代码语言:javascript
复制
  const addSmartContractListener = async () => {
    if (network) {
      provider.once("block", () => {
        contract.once("UpdatedMessages", (old, data)=>{
          console.log(old, data)
        })
      })
    }
  }

现在,每个事件发出一次调用函数console.log(旧的数据)。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/143295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档