Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 setInterval';之前未完成回调函数;s超时_Javascript - Fatal编程技术网

Javascript setInterval';之前未完成回调函数;s超时

Javascript setInterval';之前未完成回调函数;s超时,javascript,Javascript,如果回调函数在setInterval函数超时之前未完成,结果会是什么 例如: setInterval(function() { // This block takes more than 5 seconds. }, 4000); 现在setInterval的timemout为4秒,而回调函数需要5秒才能完成。会发生什么,它会等待函数完成还是让函数在4秒内再次执行回调?它会等待回调完成,因为JavaScript是单线程的。如果运行下面的代码段,您将看到'done'每隔5秒打印一次 s

如果回调函数在setInterval函数超时之前未完成,结果会是什么

例如:

setInterval(function() {
    //  This block takes more than 5 seconds.
}, 4000);

现在setInterval的timemout为4秒,而回调函数需要5秒才能完成。会发生什么,它会等待函数完成还是让函数在4秒内再次执行回调?

它会等待回调完成,因为JavaScript是单线程的。如果运行下面的代码段,您将看到
'done'
每隔5秒打印一次

setInterval(函数(){
让curr=新日期;
而(新日期()-curr则视情况而定

如果你把一些计算放在那里,恰巧需要5秒钟(比如寻找素数之类的东西),你会锁定主线程,只有当它被解锁时才会执行另一个调用,所以在这种情况下,大约5秒钟后


例如,如果需要很长时间的部分是一个http请求,它会像应该的那样每4秒调用一次函数。据我所知,
setInterval
中没有机制检查函数的承诺是否完成。

由于事件循环、任务队列和JavaScript的单线程性质,它会ys等待函数完成。除非强制停止脚本,否则永远不会取消同步代码

报告说计时器必须:

等待具有相同方法上下文、在该方法上下文之前启动且其超时等于或小于该方法上下文的任何[timer initialization algorithm]调用完成

其他计时器和浏览器/运行时任务也会在函数之间运行。但是,如果函数在主线程上运行,则程序只会在函数未运行时接收事件。在浏览器中,这意味着网站在大多数时间都不会交互

由于这些原因,此类具有大量同步计算的函数应该在一个任务内运行,或者在多个任务之间拆分(请参阅)


(我假设“此块花费的时间超过5秒。”意味着函数在5秒后返回。)

因此您的setInterval有两个参数,一个回调和持续时间(4s) 有几件事会影响你的休息时间:

  • 您的setInteval调用一个浏览器API,该API将启动一个计时器,精确到4秒。一旦计时器触发这4秒,它将把您的回调附加到JS回调队列上。同样,这将在4秒之后发生
  • 一旦执行了所有同步代码,JS将开始在回调队列中运行回调,一次一个

回答您的问题:如果只是您发布的代码,则很可能需要4秒。如果您的代码中有一些耗时超过4秒的繁重操作,则该代码可能需要更长的时间,因为它将仅在之后运行。

查看此信息,我找到了自己的答案。 这样做的目的是,它在每次超时后生成一个线程来执行回调函数

document.write(
); setInterval(函数(){ var x=Date.now(); 文件。写入(x+“
”); setTimeout(函数(){ var y=Date.now(); document.write(y.toString()+':'+(y-x.toString()+'
); }, 5000);
},2000);
不要在Firefox中尝试此示例,因为它可能会使浏览器没有响应。(在Chrome中工作正常,因为它对每个选项卡和浏览器本身都使用单独的过程。)它不完全是单线程的。使用setInterval每次触发单独工作的回调时都会创建一个新线程。请看我上面提到的答案。@TrishantPahwa这是不正确的。请看这里:我认为它不会等待,我希望我可以在注释中粘贴代码,但请尝试以下操作:保存间隔引用,更改
4000
1000
,然后添加
setTimeout
语句,该语句将在
2100
毫秒后清除间隔。您将看到
完成
被打印两次,这意味着
setInterval
有机会在堆栈中放置第二个回调,而第一个回调仍在运行。思考?@hev1,一个不正确的示例。