Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.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 有没有办法使这个名称生成循环运行最少几秒钟?_Javascript_Jquery - Fatal编程技术网

Javascript 有没有办法使这个名称生成循环运行最少几秒钟?

Javascript 有没有办法使这个名称生成循环运行最少几秒钟?,javascript,jquery,Javascript,Jquery,我使用以下代码(其中包含一些Frog VLE API代码;希望这不是太相关)从列表中随机挑选一个学生 这很有效,但有时——考虑到其随机性——它只运行很短的一段时间。是否可以先循环多次,以确保它至少运行X个时间段 var Count = 0; /* construct the array of people */ for (var i in data.users) { for (var n = 0; n < data.users[i].Quantity; n++) {

我使用以下代码(其中包含一些Frog VLE API代码;希望这不是太相关)从列表中随机挑选一个学生

这很有效,但有时——考虑到其随机性——它只运行很短的一段时间。是否可以先循环多次,以确保它至少运行X个时间段

var Count = 0;

/* construct the array of people */
for (var i in data.users) {
    for (var n = 0; n < data.users[i].Quantity; n++) {
        var TempObj = { 'Count' : Count, 'Student_ID' : i, 'Student_Name' : data.users[i].Student_Name };
        RewardPurchases.PurchasesArray[Count] = TempObj;
        Count++;
    }
}
var计数=0;
/*构建人脉*/
for(data.users中的var i){
对于(var n=0;n
。。。这里有更多的代码,与脚本的工作方式无关

$('button#random').click( function() {

    /* first things first, play a drum-roll when the button is clicked! */
    $('embed').remove();
    $('body').append('<embed src="/user/74/177499.wav" autostart="true" hidden="true" loop="true">');

    /* take the RewardPurchases.PurchasesArray and sort it so that there's no particular order */
    RewardPurchases.PurchasesArray.sort(function() {return 0.5 - Math.random()})

    /* remove the winner class for consecutive re-rolls */
    $display.removeClass( "winner" );
    $display.addClass( "spinner" );

    /* determine the number of people in the array and calculate a random winner */
    var total = RewardPurchases.PurchasesArray.length,
        selected = Math.floor( Math.random() * total ),
        i = 0;

    /* work out how long each name should appear for, dependent upon how many people are in the array */
    var timeout = ( 15000 / total );

    /* run through the array of people ... */
    for (i=0; i<total; i++) {

        setTimeout((function(i){
            return function(){
                console.log( "timeout", i );

                /* ... if the person in the array is a valid person! then display their name */
                if (typeof RewardPurchases.PurchasesArray[i] === 'object' && typeof RewardPurchases.PurchasesArray[i] !== null) {
                    $display.text( "[" + RewardPurchases.PurchasesArray[i].Count + "] " + RewardPurchases.PurchasesArray[i].Student_Name.toUpperCase() );

                    /* if we encounter the winner, play a cheering wav and change the class of the display so that they appear in big, bold, red text */
                    if( i === selected ) {
                        $('embed').remove();
                        $('body').append('<embed src="/user/74/177086.wav" autostart="true" hidden="true" loop="false">');

                       $display.addClass( "winner" );
                    }
                }
            };
        }(i)), i*timeout);

        /* if the winner has been found, break the loop */
        if( i === selected ) {
            break;
        }
    }
} );
$('button#random')。单击(函数(){
/*首先,当按钮被点击时,击鼓*/
$('embed').remove();
$('body')。追加('');
/*拿着RewardPurchases.PurchasesArray并对它进行排序,这样就没有特定的订单了*/
rewardpurchasearray.sort(函数(){return 0.5-Math.random()})
/*移除连续重新掷骰的优胜者等级*/
$display.removeClass(“获胜者”);
$display.addClass(“微调器”);
/*确定数组中的人数并计算一个随机赢家*/
var total=RewardPurchases.PurchaseArray.length,
选定=数学地板(数学随机()*总计),
i=0;
/*根据数组中的人数,计算每个名称应显示多长时间*/
变量超时=(15000/总计);
/*在人群中穿行*/
对于(i=0;i在var超时后=(15000/总计);插入以下内容,并删除(i=0;i)的行
var totalTime=2000;
var超时=数学上限(总时间/超时);
var timesToDisplay=总时间/超时;
var currentDisplay=0;
对于(currentDisplay=0;currentDisplay
您可以这样做:

function doforsec(msec, func) {
    var curDate = new Date().getTime();
    while ((new Date().getTime() - curDate) < msec) {
        func();
    }
}
doforsec(200, function() {
    console.log(new Date().getSeconds())
});​
函数doforsec(msec,func){
var curDate=new Date().getTime();
而((新日期().getTime()-curDate)
这会一次又一次地执行给定给doforsec的函数,直到指定的时间段(以毫秒为单位)结束。(首先我有秒,但我认为毫秒会更好)


因为我的最后期限是..嗯,从发布这篇文章开始大约8小时..我决定重新编写脚本并使用jQuery插件:

Array.prototype.remove = function(from, to) {
    var rest = this.slice((to || from) + 1 || this.length);
    this.length = from < 0 ? this.length + from : from;
    return this.push.apply(this, rest);
};

$(document).ready(function(){

        var staff = [ 'hardcoded', 'list', 'of', 'staff', 'members' ];

        $('button#start').click( function() {
        var $display = $('#display'),
            $results = $('#results table');
        $display.removeClass( "winner" );
        $display.addClass( "spinner" );

        var counter = 0,            
            rand = 0,
            run_time = 10,
            delay = ( run_time * 100 ) / staff.length,
            loop_number = 5,
            max_count = staff.length * loop_number;

        $display.doTimeout( 'loop', delay, function() {
            counter++;
            var newRand = Math.floor( Math.random() * staff.length );
            if ( rand === newRand ) {
                rand = Math.floor( Math.random() * staff.length );
            } else {
                rand = newRand;
            }

            $(this).text( staff[rand] );

            if ( counter < max_count ) { return true; }
            else {
                $('#results tr:last').after('<tr><td class="number">' + staff.length + '</td><td>' + staff[rand] + '</td></tr>');
                staff.remove( rand );
            }
        });

        $display.doTimeout( 'class', max_count * delay, function() {
            $display.removeClass( "spinner" );
            $display.addClass( "winner" );
        });
    });

});
Array.prototype.remove=函数(从,到){
var rest=this.slice((to | | from)+1 | | this.length);
this.length=from<0?this.length+from:from;
返回此。推。应用(此,其余);
};
$(文档).ready(函数(){
var staff=[‘硬编码’、‘列表’、‘工作人员’、‘成员’];
$(“按钮#开始”)。单击(函数(){
变量$display=$(“#display”),
$results=$(“#结果表”);
$display.removeClass(“获胜者”);
$display.addClass(“微调器”);
变量计数器=0,
兰德=0,
运行时间=10,
延迟=(运行时间*100)/staff.length,
回路编号=5,
最大计数=staff.length*循环计数;
$display.doTimeout('loop',delay,function(){
计数器++;
var newRand=Math.floor(Math.random()*staff.length);
if(rand==newRand){
rand=Math.floor(Math.random()*staff.length);
}否则{
兰德=纽兰德;
}
$(本).text(职员[rand]);
如果(计数器<最大计数){return true;}
否则{
$('#results tr:last')。在(''+staff.length+''+staff[rand]+'')之后;
移除(兰德);
}
});
$display.doTimeout('class',max_count*delay,function()){
$display.removeClass(“微调器”);
$display.addClass(“获胜者”);
});
});
});

Hi Alex。这在某种程度上是可行的,但它只会延长每个名字在获胜者被选中之前在屏幕上显示的时间。这将是我的“退后方法”,但我宁愿系统“再次循环”或者,如果可能的话。对不起,我误解了这个问题。你能解释一下代码的作用吗?谢谢你的努力,但是这似乎没有改变我所看到的任何东西?当我尝试与两个学生一起学习时,只需要不到一秒钟的时间就可以完成。@dunc这只适用于totalTime的更高值。尝试设置It到15000或更多你能解释一下代码的作用吗?嗨@AlexDev我已经更新了我的代码,并对它的工作原理进行了评论。我尝试过使用它,但当我尝试复制原始代码中的
for
循环时(减去选择位,循环只循环几次),它根本不起作用-似乎什么都没有发生。我使用示例Students数组在上面执行for循环,并将while循环包装为“看看这个”,然后更改
msec
变量,它将在指定的时间内运行
Array.prototype.remove = function(from, to) {
    var rest = this.slice((to || from) + 1 || this.length);
    this.length = from < 0 ? this.length + from : from;
    return this.push.apply(this, rest);
};

$(document).ready(function(){

        var staff = [ 'hardcoded', 'list', 'of', 'staff', 'members' ];

        $('button#start').click( function() {
        var $display = $('#display'),
            $results = $('#results table');
        $display.removeClass( "winner" );
        $display.addClass( "spinner" );

        var counter = 0,            
            rand = 0,
            run_time = 10,
            delay = ( run_time * 100 ) / staff.length,
            loop_number = 5,
            max_count = staff.length * loop_number;

        $display.doTimeout( 'loop', delay, function() {
            counter++;
            var newRand = Math.floor( Math.random() * staff.length );
            if ( rand === newRand ) {
                rand = Math.floor( Math.random() * staff.length );
            } else {
                rand = newRand;
            }

            $(this).text( staff[rand] );

            if ( counter < max_count ) { return true; }
            else {
                $('#results tr:last').after('<tr><td class="number">' + staff.length + '</td><td>' + staff[rand] + '</td></tr>');
                staff.remove( rand );
            }
        });

        $display.doTimeout( 'class', max_count * delay, function() {
            $display.removeClass( "spinner" );
            $display.addClass( "winner" );
        });
    });

});