Javascript 暂停&;在循环中恢复设置超时

Javascript 暂停&;在循环中恢复设置超时,javascript,jquery,Javascript,Jquery,我有以下$。每个$循环通过一个对象。每5秒调用一次get_file()函数。是否还包括暂停和恢复选项。因此,如果单击“暂停”,数据加载将停止。当然,当我点击一个恢复按钮时,它会从它停止的地方再次启动 var curfile = 0; var load_file_timers; function load_files() { load_file_timers = obj.map(function(v, i) { if (i < curfile) {

我有以下$。每个$循环通过一个对象。每5秒调用一次get_file()函数。是否还包括暂停和恢复选项。因此,如果单击“暂停”,数据加载将停止。当然,当我点击一个恢复按钮时,它会从它停止的地方再次启动

var curfile = 0;
var load_file_timers;

function load_files() {
    load_file_timers = obj.map(function(v, i) {
        if (i < curfile) {
            return null;
        } else {
            return setTimeout(function() {
                var file = v.newfile;
                var timeline_date = moment(v.last_modified_date).format("dddd, MMMM Do YYYY, h:mm:ss a");
                bHover = 0; //re-highlight links
                $(".timeline_msg").html(timeline_date);
                get_file(file);
                curfile++;
            }, 5000 * (i - curfile + 1));
        }
    });
}

load_files();

$("#pause").click(function() {
    $.each(load_file_timers, function(i, timer) {
        if (timer) {
            clearTimeout(timer);
        }
    });
});

$("#resume").click(load_files);
希望有人能帮忙

$.each(obj, function (i, v) {

   setTimeout(function () {
     file = v.new_file;
     var timeline_date = moment(v.last_modified_date).format("dddd, MMMM Do YYYY, h:mm:ss a");
     bHover = 0; //re-highlight links
     $(".timeline_msg").html(timeline_date);
     get_file(file);
   }, 5000 * (i + 1));

});

当您调用
setTimeout()
时,系统将返回一个该计时器的句柄,然后可以将该句柄传递给调用
clearTimeout()
。这将取消计时器的后续触发(假设尚未触发)。这可以是与“暂停”选项关联的代码。当您想要恢复时,只需再次执行相同的
setTimeout()
code即可恢复下一个间隔的计时器

本故事假定计时器已使用
setTimeout()
设置,并且暂停应防止计时器触发


请参阅。

创建所有计时器的数组,以便在单击暂停按钮时清除它们。使用全局变量跟踪要加载的文件列表的执行距离。然后你可以从你离开的地方继续

var curfile = 0;
var load_file_timers;

function load_files() {
    load_file_timers = obj.map(function(v, i) {
        if (i < curfile) {
            return null;
        } else {
            return setTimeout(function() {
                var file = v.newfile;
                var timeline_date = moment(v.last_modified_date).format("dddd, MMMM Do YYYY, h:mm:ss a");
                bHover = 0; //re-highlight links
                $(".timeline_msg").html(timeline_date);
                get_file(file);
                curfile++;
            }, 5000 * (i - curfile + 1));
        }
    });
}

load_files();

$("#pause").click(function() {
    $.each(load_file_timers, function(i, timer) {
        if (timer) {
            clearTimeout(timer);
        }
    });
});

$("#resume").click(load_files);
var curfile=0;
变量加载文件定时器;
函数加载_文件(){
加载文件定时器=obj.map(函数(v,i){
如果(i
这方面的递归解决方案是

var array = $.map(obj,function(v,i){
    return v;
});

var timer;
var fileId=0;

function execute(){
     timer = setTimeout(function () {
               v = array[fileId];
               var file = v.newfile;
               var timeline_date = moment(v.last_modified_date).format("dddd, MMMM Do YYYY, h:mm:ss a");
               bHover = 0; //re-highlight links
               $(".timeline_msg").html(timeline_date);
               get_file(file);
               fileId++;
               if (array.length > fileId){
                   execute();
               }
           }, 1000);
}

$('document').ready(function(){

    $('#loop_controler').click(function(){
        if (fileId < array.length){
            if ($(this).text() == 'pause'){
              clearTimeout(timer);
              $(this).text('resume');
            } else {
              execute();
              $(this).text('pause');
            }
        }
    });

    execute(array,0);
});
var数组=$.map(obj,函数(v,i){
返回v;
});
无功定时器;
var fileId=0;
函数execute(){
定时器=设置超时(函数(){
v=数组[fileId];
var file=v.newfile;
var timeline_date=时刻(v.last_modified_date)。格式(“ddddd,MMMM Do YYYY,h:mm:ss a”);
bHover=0;//重新突出显示链接
$(“.timeline\u msg”).html(timeline\u日期);
获取_文件(file);
fileId++;
if(array.length>fileId){
执行();
}
}, 1000);
}
$('document').ready(函数(){
$(“#循环控制程序”)。单击(函数(){
if(fileId
clearTimeout的可能重复项没有任何作用,因为循环每5秒加载并触发对函数的每次调用。当您调用clearTimeout时,没有什么需要清除的。@rob您的代码显示您正在设置一个5秒的计时器。当它开火时,我假设你会设置它在5秒钟后再次开火。如果您想暂停此操作,则可以取消计时器的启动。因为它不会再次启动,所以不会再次重新启动。。。所以我们就可以暂停了。他设置了N个不同的计时器,每个计时器间隔5秒。每一个从
obj
数组加载不同的文件。使用此选项时,需要重置curfiles=0以重新启动。还有一个额外的分号…this},5000*(i-curfile+1));});应该是},5000*(i-curfile+1));})然后它就完美了!