为什么在延迟中使用setTimeout

时间:2013-08-29 11:17:35

标签: javascript deferred

我试图理解延迟是如何工作的,因此在所有这些中,他们使用setTimeout

this.callbacks;// array of functions reference
this.callbacks.forEach(function(callback){
    window.setTimeout(function(){
          callback(data);
    },0);
});

this questions使用setTimeout

的一个示例
resolve: function (data) {
    this.promise.okCallbacks.forEach(function(callback) {
      window.setTimeout(function () {
        callback(data)
      }, 0);
    });
  },

setTimeout的循环调用函数与callback();callback.call();

之间的差异有何不同

4 个答案:

答案 0 :(得分:12)

这样做的原因是允许javascript线程触发可能在队列中等待的任何其他事件。

Javascript是单线程的。如果触发了某个事件,则只能在当前运行的代码完成时运行。

使用零时间延迟的setTimeout有效地告诉JS解释器callback函数调用是新上下文的一部分,并且当前代码块已完成。这意味着JS会在调用callback()之前抓住机会检查是否需要处理其他事件。

虽然这可能会导致callback()本身无法立即被调用,但这对您网站的整体效果有利:

可能需要处理的其他事件包括点击事件和其他UI触发器。如果您没有给他们执行的机会,可能会使您的用户界面显得迟钝或无响应。

答案 1 :(得分:3)

不立即调用

setTimeout(func,0)

只需使用回调模拟异步函数。

function asyncFunc(callback) {
    console.log("step1");
    setTimeout(callback,0);
    console.log("step2");
}

asyncFunc(function() {console.log("async step")});
/* output:
step1
step2
async step
*/

https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

  

由setTimeout()执行的代码在一个单独的执行上下文中运行,该函数从中调用它。

因此它在一个单独的执行上下文中运行,但在执行它之前,javascript应该结束当前执行,因为javascript在单线程上运行。

当前执行期间的时间并不重要,因为它必须在执行另一个任务之前结束。

如果在任务结束之前有一个无限循环,例如,永远不会调用你的回调。

答案 2 :(得分:2)

时间过去 setTimeout 并且 JavaScript进程是免费的。

使用call会立即运行回调并阻止其他所有内容。

答案 3 :(得分:1)

setTimeout()允许您在经过指定的时间后注册一次要调用的函数。

Window对象的setTimeout()方法计划在a之后运行的函数 指定的毫秒数。 setTimeout()返回可以的值 传递给clearTimeout()取消执行预定的功能。

如果以0 ms的时间调用setTimeout(),则不会调用您指定的函数 马上。相反,它被放置在一个队列中,以便“尽快”调用 任何当前待处理的事件处理程序都已完成运行。