Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在异步JS中暂停执行的最佳方法_Javascript_Asynchronous - Fatal编程技术网

Javascript 在异步JS中暂停执行的最佳方法

Javascript 在异步JS中暂停执行的最佳方法,javascript,asynchronous,Javascript,Asynchronous,我正在Node.JS中构建一个聊天机器人,希望能够以一种简单的方式在消息之间插入几秒钟的延迟 我已经提出了3种不同的方法,所有这些方法都有效,但没有一种是正确的,我希望了解实现延迟的最佳方法是什么,以及选择和构建的最佳方法是什么 使用async delay()函数暂停。它工作得很好,但它似乎是一种奇怪的方法,更像是一种黑客行为,而不是一种预期的功能 嵌套的setTimeout()函数。这一个在几次延迟后将代码弄得一团糟 具有附加超时的多个设置超时。计算超时可能会成为一件麻烦事,尤其是在插入或删除

我正在Node.JS中构建一个聊天机器人,希望能够以一种简单的方式在消息之间插入几秒钟的延迟

我已经提出了3种不同的方法,所有这些方法都有效,但没有一种是正确的,我希望了解实现延迟的最佳方法是什么,以及选择和构建的最佳方法是什么

  • 使用async delay()函数暂停。它工作得很好,但它似乎是一种奇怪的方法,更像是一种黑客行为,而不是一种预期的功能
  • 嵌套的setTimeout()函数。这一个在几次延迟后将代码弄得一团糟
  • 具有附加超时的多个设置超时。计算超时可能会成为一件麻烦事,尤其是在插入或删除某些内容时

  • 我倾向于最后一个,然后使用递增变量来表示总时间。第一种感觉最干净,最容易实现。

    我不知道这是否是你想要的答案。 但这个软件包可能有用。

    你为什么认为第一种方法似乎是一种黑客行为?不太确定,我一直被教导代码属于setTimeout,我很喜欢这种方法,只是想知道它是否有任何缺点如果你只关注单线程环境,我认为第一种方法是三种方法中最干净的。关于第一种方法的更多细节。是的,这就是我想要的,但它看起来像是第一种方法的一个过于复杂的版本。我真的在考虑选择那一个。如果你只想延迟你的消息,那么在软件包中就不需要其他功能了。我想你可以使用第一种方法。它是最干净和最容易使用的。该软件包仅在您想要清除延迟时有用,例如“嘿,用户,请在3分钟内键入您的密码”。如果他输入,您可以使用
    delay.signal
    取消延迟并调用所需的函数。
    const delay = async time => {
      await new Promise(r => setTimeout(() => r(), time))
    }
    
    console.log('Message 1');
    await delay(1000)
    console.log('Message 2');
    
    setTimeout(() => {
      console.log('Message 1');    
      setTimeout(() => {
        console.log('Message 2');   
        // etc...   
      }, 1000)
    }, 1000)
    
    setTimeout(() => void console.log('Message 1'), 1000)
    setTimeout(() => void console.log('Message 2'), 1000 + 1000)