0

次のコード (いくつかの 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++;
    }
}

... ここにコードを追加します。スクリプトの動作に関連するものは何もありません ...

$('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;
        }
    }
} );

前もって感謝します、

4

3 に答える 3

1

次のようなことができます:

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 に指定された関数を何度も実行します。(最初は秒でしたが、ミリ秒の方が良いと思います)

JSフィドル

于 2012-07-19T14:20:29.660 に答える
0

varタイムアウト後=(15000 /合計); 以下を挿入し、(i =0;iの行を削除します

var totalTime = 2000;
var timeOut= Math.Ceiling(totalTime/timeout);
var timesToDisplay = totalTime / timeOut;
var currentDisplay = 0;
for (currentDisplay = 0; currentDisplay < timesToDisplay; currentDisplay++) {

    i = currentDisplay % total;
于 2012-07-19T14:09:06.453 に答える
0

これの締め切りは..まあ、これを投稿してから約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" );
        });
    });

});
于 2012-07-19T23:28:18.410 に答える