我试图理解延迟是如何工作的,因此在所有这些中,他们使用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();
答案 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()
,则不会调用您指定的函数
马上。相反,它被放置在一个队列中,以便“尽快”调用
任何当前待处理的事件处理程序都已完成运行。