0

こんにちは、RubyOnRails で 1 つのサイトを作成しています。クライアント側で一部のコンテンツを表示する際に問題があります。私がやりたいのは、10 秒ごとにニュースが変わるニュースのようなものです。私がやったことは、サーバーからニュースを取得する ajax を作成したことです。サーバーは json 応答で配列を返します。これで、クライアント側にすべてのニュース配列があり、10 秒間隔で 1 つずつ表示したいと考えています。このコードを試してみましたが、最後のニュース以外は何も表示されません。

function get_news(){
    $.ajax({
          url : "my.json",
          success:function(data){
              // data is array of json like [{"html" : "dfsf"},{"html":"ddd"}]
              news_change(data);
          }
    });
}

get_news();

function news_change(feed){
    $.each(feed,function(index,f){
        var feed_html = f.html;
        $('#news_div').fadeOut('slow', function(){
          $('#news_div').html(feed_html);
          $('#news_div').fadeIn('slow');
        });
        sleep(10000);
    });
}

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
          break;
        }
    }
}

このコードを実行すると、最後のニュースのみが表示されます。また、ブラウザがハングします。なぜこれがなぜなのか教えてください。

4

1 に答える 1

1

setTimeoutまたはsetIntervalを使用します。これらは、特定のミリ秒数後に非同期でコードを実行します。ループは同期的であり、実行中はブラウザをロックします。

// this will execute get_news every 10,000 ms
var newsInterval = setInterval(get_news, 10000);

// if you ever want to stop the interval, use clearInterval
clearInterval(newsInterval);

はajax呼び出しを実行することに注意してくださいget_news。これには時間がかかる場合があります。つまり、ニュースは10秒ごとに正確に更新されません。

編集:10秒ごとにニュース配列を反復処理するには、news_change関数をsetIntervalに渡します。

var newsInterval;

function get_news(){
    $.ajax({
        url : "my.json",
        success:function(data) {
            newsInterval = setInterval(function () {
                news_change(data);
            }, 10000);
        }
    });
}

get_news();

// if you ever want to stop the interval, use clearInterval
clearInterval(newsInterval);
于 2012-12-09T12:21:30.340 に答える