【问题标题】:Javascript delay function [duplicate]Javascript延迟函数[重复]
【发布时间】:2013-06-14 15:34:10
【问题描述】:

我正在构建一个 JavaScript 库。我一直在研究一个像这样工作的延迟函数:

function delay(ms) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > ms){
            break;
        }
    }
}

我的想法是我可以做这样的事情:

window.onload = function() {
  delay(5000);  //this function will act 5 seconds after the page loads
  document.getElementById('Header').innerHTML = 'Welcome';
};

延迟工作正常,但它会停止页面上的所有 javascript,而不仅仅是延迟 window.onload 函数。

有人知道我能做什么吗?

【问题讨论】:

  • 不要那样做!永远不要循环等待条件。使用 setTimeout 和队列。
  • 恐怕这是一种绝对糟糕的做事方式。您需要查看setTimeout()
  • @Pointy - 好的,我会的
  • 您将无法获得像您想要的那样简单的解决方案。这是a related question with a simple queue implementation

标签: javascript html


【解决方案1】:

使用 setTimeout 代替您的延迟方法。它不会阻塞 UI,而且更干净。

setTimeout(function() {
   document.getElementById('Header').innerHTML = 'Welcome';
}, 5000);

【讨论】:

  • 好吧,这并不能解决 OP 问题:他想要一个延迟函数...
  • 这将在 5 秒延迟后执行他的函数。缺少什么?
  • OP说他想建一个带延迟功能的库...
  • 我认为@dystroy的意思是,OP想要创建他们自己的延迟函数。
  • @CodeApprentice 我的想法也是我不知道为什么它有这么多赞成票。我认为人们不太了解这个问题。
【解决方案2】:

认为您的问题(以及对Patrick D's answer 的回复)是基于误解。

没有办法实现你想要的代码。

JavaScript 环境是单线程的。 (让我们暂时忽略网络工作者。)这意味着每一行都在它之前的那一行之后执行。

如果您有一个函数占用这个(一个且唯一的)线程 5 秒,那么在这 5 秒内不会运行其他任何东西。就这么简单。

我们在 JavaScript 世界中解决这个问题的方法是利用异步编程,它利用回调。 setTimeout 函数是解决这个问题的正确方法。

现在,您可以这样做了。假设您想要一个函数,给定某个函数fn,返回一个新函数,该函数在设定的延迟后执行fn。你可以实现这个:

Function.prototype.delay = function(ms) {
    var fn = this;
    return function() {
        setTimeout(fn, ms);
    };
};

然后您可以假设编写如下代码:

function foo() {
  // something or other
}

var fooDelayed = foo.delay(5000);

// Now this line will execute foo after 5 seconds.
fooDelayed();

如果你真的想要这样的东西,这是可能的。但它本质上仍然是setTimeout 的包装:这是无法避免的。

请参阅 this jsFiddle 演示该想法。

【讨论】:

  • 好吧,谢谢。您应该将此标记为您的答案。
  • 感谢您很好地解释了您的答案,您已经完全回答了我的问题。
【解决方案3】:

如果你真的想围绕setTimeout() 构建一个函数,你可以这样做:

function delay(ms, callback) {
  setTimeout(callback, ms);
}

绝对没有其他方法可以延迟代码块的操作或执行没有阻塞机制。

而且因为setTimeout() 是异步执行的,所以你总是要提供一个回调函数!

【讨论】:

  • 你能举个例子说明如何使用它吗?
  • 这个解决方案和我的回答一样,只是抽象出一个参数。在任何一种情况下,您仍然必须使用回调。完全一样。
  • @PatrickD 绝对!我也无法理解 OP 需要这种冗余功能的原因。顺便说一句,为你 +1。
猜你喜欢
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2018-07-11
相关资源
最近更新 更多