【问题标题】:Is `setInterval` until condition bad practice?`setInterval`直到条件不好的做法吗?
【发布时间】:2020-02-09 13:31:04
【问题描述】:

如果我在继续之前等待条件为真,那么这样做是不好的做法还是效率低下:

const myInterval = setInterval(() => {
  if(condition) {
    doMyAction();
    clearInterval(myInterval);
    return;
  }
}, 1);

【问题讨论】:

  • 是什么导致condition 发生变化?这应该通过 Promise 或回调甚至事件处理程序触发 doMyAction
  • 是的,我可以使用 async/await 来做到这一点。我只是想知道执行 setInterval 是否天生就不好
  • 如果你已经有了 Promise,那么改用 setInterval 轮询绝对是个糟糕的主意

标签: javascript


【解决方案1】:

这完全取决于上下文以及您使用这种方法的原因。如果您传递的确切时间很重要,那么使用它是合理的。例如动画。如果你需要根据条件和时间间隔执行某个动画,那当然可以。

如果以明确的方式提供条件:可能需要更快,可能需要更长的时间 - 那么您肯定会想要使用异步方法。例如,当您等待服务器响应请求时,这完全取决于用户的互联网连接速度,因此会有所不同。 async/await 肯定会更高效,不会浪费时间或破坏用户体验。使用setInterval/setTimeout,您正在赌它将如何为用户发挥作用。

归根结底,这两种方法都很有用。您只需要确保针对任何特定问题做出正确的选择。

看看async/await 在像你这样的情况下的用法。 Here 也是另一个与您讨论类似问题的问题,您可以参考。

参考资料:

【讨论】:

    【解决方案2】:

    这不是一个坏习惯,在可能的情况下结束你的间歇实际上是一个好习惯。但是使用间隔来等待某些东西通常不是一个好习惯。 JavaScript 为此内置了功能:async/awaitPromise。这些等待 asynchronous 操作(例如 get 请求)在做出反应之前返回答案!

    编辑:提示!

    • 间隔是严格基于时间的。如果您正在等待用户,请尝试使用事件侦听器。
    • 您可能很想尝试 while 循环,但它们通常不适用于 Web,因为它们会阻止任何其他 JavaScript 运行,直到循环结束!

    【讨论】:

    • 请注意,您并不总是能够使用事件侦听器。一个常见的示例是在诸如 selenium 或 nightmare.js 之类的爬虫脚本中,您正在等待其他人的 ajax 调用完成。你没有能力听那个电话。所以你最好的选择是等待相关的事情发生(声明的变量,出现的元素等)。另一个可能发生这种情况的常见地方是混搭/小部件。您通常无法直接收听事件,因为您在其他人的网站上运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2014-01-07
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多