Javascript 有没有办法使这个名称生成循环运行最少几秒钟?
我使用以下代码(其中包含一些Frog VLE API代码;希望这不是太相关)从列表中随机挑选一个学生 这很有效,但有时——考虑到其随机性——它只运行很短的一段时间。是否可以先循环多次,以确保它至少运行X个时间段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++) {
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" );
});
});
});