【问题标题】:Infinite Loop from Promise and useState Hook来自 Promise 和 useState Hook 的无限循环
【发布时间】:2021-10-09 23:01:01
【问题描述】:

我无意中从 fetch promise 和 react 中的 useState 钩子中创建了一个无限循环。谁能指出为什么这是重复的?我对这两个部分的理解有点薄弱,我想用正确运行的代码进行清晰的解释将有助于我了解两者的工作原理。

仅供参考 - loreReturn 变量是一个带有一些事务 ID 的对象,getData 函数会使用这些 ID 从 Web 中获取一些文本。

export function TextExample(){
  let testText = "no itemLore yet";
  const [text, textAdd] = useState(testText);
    const txs = loreReturn.data.transactions.edges;
    txs.forEach ((tx) => {arweave.transactions.getData(tx.node.id, {decode: true, string: true}).then(data => {
        console.log(data);
        textAdd(text + data);
    });
  });
  return (
    <div>
      <p>{text}</p>
    <
/div>
  ); 
};

【问题讨论】:

    标签: reactjs promise react-hooks


    【解决方案1】:

    将您的 API 调用放入 useEffect 挂钩并添加必要的依赖项。这将确保您不会在每次重新加载组件时重复运行 API 调用

    export function TextExample(){
      let testText = "no itemLore yet";
      const [text, textAdd] = useState(testText);
    
      useEffect(()=>{
        const txs = loreReturn.data.transactions.edges;
        txs.forEach ((tx) => {
            arweave.transactions.getData(tx.node.id, {decode: true, string: true})
                .then(data => {
                    console.log(data);
                    textAdd(text + data);
          });
        });
      }, [])
        
      return (
        <div>
          <p>{text}</p>
        </div>
      ); 
    };
    

    【讨论】:

    • 谢谢!澄清一下,react 钩子被设置为一遍又一遍地加载并不断更新状态,所以我将 textAdd 放在 API 中的事实意味着它必须一遍又一遍地运行该获取,并且每次都打印结果时间?
    • 问题 - loreReturn 对象有多个事务要 forEach 循环。目前,看起来此修复记录了控制台中的每个事务,但仅使用一个事务更新 useState 挂钩。显示哪个交易是不可预测的,大概是最先交付的交易?还是最后一个?知道如何顺序更新 useState 挂钩以一个接一个地显示每个事务吗?
    • @GhostOutfit 状态变量,这里text是状态变量,它不会实时更新,可能需要一段时间才能更新值。所以建议你把需要的值设置为普通变量,完成所有操作后将值设置为状态
    猜你喜欢
    • 2021-01-22
    • 2020-09-06
    • 2021-08-11
    • 2021-11-11
    • 2020-02-21
    • 2021-08-28
    • 2021-02-13
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多