当前位置: 首页 > 知识库问答 >
问题:

如何让setInterval在应用延迟之前运行回调函数一次

松茂实
2023-03-14

我在useEffect钩子中运行setInterval来循环函数,但是,我希望在应用延迟(interval)之前能够先运行该函数一次。在应用延迟之前,是否有一种方法可以在useEffect钩子中运行该函数一次?

在setInterval函数之前,我曾尝试在钩子中运行该函数一次,但它没有给我希望的结果。在useEffect挂钩之外运行函数也是如此。

  const myText = props.text;
  const textTimeout = 100;
  const funTextInterval = textTimeout * myText.length
  const [quickText, setQuickText] = useState([]);

  const setDelay = (i) => {
    setTimeout(() => {
       myFunction();
     , textTimeout * i);
  };

  useEffect(() => {
    setInterval(() => {
      for (let i = 0; i < myText.length + 1; i++) {
        setDelay(i);
      }
    }, funTextInterval);    
  }, []);

我希望forloop在setInterval的延迟开始之前运行一次,但是延迟发生在forloop

共有3个答案

伍昱
2023-03-14

仅使用for循环编写单独的函数。
在调用useffect()之前先调用该函数。
从内部useffect()调用-

下面给出未经测试的代码以供说明。

const myText = props.text;
const textTimeout = 100;
const funTextInterval = textTimeout * myText.length
const [quickText, setQuickText] = useState([]);

const setDelay = (i) => {
  setTimeout(() => {
     myFunction();
   , textTimeout * i);
};

runloop(){
  for (let i = 0; i < myText.length + 1; i++) {
    setDelay(i);
  }
}

useEffect(() => {
  setInterval(() => {
    runloop()
  }, funTextInterval);    
}, []);

runloop();
魏景龙
2023-03-14

您可以像这样分离您的逻辑:

  const myText = props.text;
  const textTimeout = 100;
  const funTextInterval = textTimeout * myText.length
  const [quickText, setQuickText] = useState([]);

  function applyTextEffect() {
      for (let i = 0; i < myText.length + 1; i++) {
        setTimeout(myFunction, textTimeout * i);
      }
  }

  useEffect(() => {
    applyTextEffect()  // call it here immediately to get the effect you want.
    setInterval(applyTextEffect, funTextInterval);    
  }, []);

但是请注意,这个组件将通过在每次更新时调用文本效果函数来创建不必要的效果。在每次更新中使用效果。最好有一个is挂载状态变量,并围绕它实现逻辑,以便只应用一次效果。

编辑:存储从setInterval函数返回的interval id并在返回useEffect时清除它也是明智的。否则,当您的组件将被销毁时,您将得到异常

晏富
2023-03-14

取出方法中的for循环逻辑,并在setInterval之前和setInterval内部调用该逻辑

const myText = props.text;
  const textTimeout = 100;
  const funTextInterval = textTimeout * myText.length
  const [quickText, setQuickText] = useState([]);

  const setDelay = (i) => {
    setTimeout(() => {
       myFunction();
     , textTimeout * i);
  };

  useEffect(() => {
    const loop = () => {
      for (let i = 0; i < myText.length + 1; i++) {
        setDelay(i);
      }
    }
    loop();
    setInterval(() => {
      loop();
    }, funTextInterval);    
  }, []);
 类似资料:
  • 问题内容: 有一种方法可以配置javascript方法以立即执行该方法,然后使用计时器执行 问题答案: 第一次直接直接调用函数是最简单的: 但是,有充分的理由要避免-尤其是在某些情况下,整个事件负荷可以彼此紧接着立即到达而没有任何延迟。另一个原因是,如果要停止循环,则必须显式调用,这意味着必须记住原始调用返回的句柄。 因此,另一种方法是使用以下方法触发自己的后续调用: 这样可以确保两次调用之间 至

  • 本文向大家介绍一定延迟后如何调用jQuery函数?,包括了一定延迟后如何调用jQuery函数?的使用技巧和注意事项,需要的朋友参考一下 要在一定延迟后调用jQuery函数,请使用方法。在这里,几秒钟后调用jQuery函数。 您可以尝试运行以下代码,以了解如何使用jQuery中的方法在延迟后调用jQuery函数- 示例

  • 如标题所示,在中,是否有方法在延迟(例如1秒)后调用函数?

  • 我想在一个HTML页面上做一个值,每5秒更新一次,这样就不会让服务器不堪重负。结果表明,我的函数中的setTimeout()没有适当延迟,而是立即被调用。有人能帮我找个线索吗?我真的不想给我的服务器太多的工作,因为我必须实现更多的Ajax。 代码如下:

  • 问题内容: 我想在两次通话之间延迟5秒…我该如何在jQuery中执行此操作…似乎jQuery对此不起作用… 问题答案: 您可以使用普通的javascript,这将在5秒后调用一次your_func: 如果您的函数没有参数且没有显式接收器,则可以直接调用我曾经用过一个插件。它具有和方法。

  • 我有下面的科特林协程代码。< code>doWorkAsync是正常(非挂起)函数,它返回< code>Deferred 我不知道如何在< code>doWorkAsync函数中使用< code>delay。 我正在使用kotlin协程版本。