2013-08-07 3 views
1

내 콘텐츠를 실시간으로 표시해야하지만, 많은 것을로드 할 때 너무 많은 CPU를 사용하며 매우 지체가 있습니다.JavaScript의 setInterval에 대한 대안은 무엇입니까?

내 코드에 대한 대안이 있습니까?

$(document).ready(function() { 
    var refresh_bal = setInterval(
     function(){ 
      $.get('./php/get_balance.php', function(balance) { 
       $('.balance').html(balance); 
      }); 
     }, 1000); 

    var refresh_total = setInterval(
     function(){ 
      $.get('./php/get_total_bets.php', function(total) { 
       $('.total').html(total); 
      }); 
     }, 1000); 

    var refresh_profit = setInterval(
     function(){ 
      $.get('./php/get_profit.php', function(profit) { 
       $('.profit').html(profit); 
      }); 
     }, 1000); 

    $('.haa').on('click', function() { 
     var refresh_bets = setInterval(
      function(){ 
       $.get('./php/get_bets.php', function(bets) { 
        $('.betsTable').html(bets); 
       }); 
      }, 1000); 
    }); 

    var refresh_site = setInterval(function(){ 
     $.get('./php/get_site.php', function(site) { 
      $('.siteStats').html(site); 
     }); 
    }, 1000); 

    var refresh_client = setInterval(function(){ 
     $.get('./php/get_client.php', function(client) { 
      $('.clientShow').html(client); 
     }); 
    }, 1000); 

    var refresh_server = setInterval(function(){ 
     $.get('./php/get_server.php', function(server) { 
      $('.serverShow').html(server); 
     }); 
    }, 1000); 

    $('.ha').on('click', function() { 
     var refresh_chat = setInterval(function() { 
      $.get('./php/get_chat.php', function(chats) { 
       $('.chats').html(chats); 
      }); 
     }); 
    }); 
}); 
+5

setTimeout과 함수를 사용하지 말고 setInterval을 사용하십시오. 이러한 요청을 적은 수의 요청으로 통합하십시오. –

+5

node.js의 가장 중요한 부분은 다른 언어가 아니라는 것입니다. 당신이 여기 사용하고있는 것과 똑같은 해결책입니다. 해결책이 아닙니다. – twinlakes

+0

@programminginallston, 저는 JS를 처음 접했습니다. KevinB 예를 들려 줄 수 있습니까? – user2609179

답변

1
(function loop() { 
    // do the logic here 
    ... 
    ... 
    setTimeout(loop, 1000); //recurse 
})(); // doesn't need to trigger the function. 
+2

어떻게 성능을 향상시킬 수 있습니까? 문제는 콜백을 기다리지 않고 여러 AJAX 호출을 반복하는 것입니다. –

7

당신이 WebSocket을로 이동하지 않고 코드의 성능을 향상시키기 위해 할 수있는 두 가지 기본 가지가 있습니다.

먼저 반복적 인 ajax 요청을 처리 할 때는 setIntervalsetTimeout으로 대체하십시오. 이것을 수행하는 이유는 setInterval을 사용하는 경우 이전에 완료되기 전에 다음 브라우저가 전송되어 결국 브라우저가 손상 될 수 있습니다. setTimeout을 사용하여 다음 요청을하기 전에 이전이 완료되었는지 확인하십시오.

(function refreshBalance() { 
    $.get('./php/get_balance.php', function(balance) { 
     $('.balance').html(balance); 
     setTimeout(refreshBalance,1000); 
    }); 
})(); 

그런 다음 모든 요청을 최대한 적은 수의 요청으로 통합하는 것이 가장 이상적입니다. 이는 요청할 때마다 헤더와 쿠키를 다시 보내야하고 브라우저가 한 번에 단일 도메인으로 보낼 수있는 최대 동시 HTTP 요청 수에 제한이 있기 때문입니다. 제한에 도달하면 이전 요청이 완료 될 때까지 아약스 요청이 지연됩니다. 이것은 또한 브라우저를 잠글 수 있습니다. 당신이 HTML5 사이트를 프로그래밍하는 경우

+0

나는 그것을했다, 고마워. 하지만 때로는 setInterval 또는 setTimeout을 사용할 때 그 중 아무 것도 나타나지 않습니다. 왜 그런 일이 일어나는거야? – user2609179

+0

사례별로 디버깅해야합니다. 거기에 수십 가지 이유가 나타나지 않습니다. 서버가 예상치 못한 것을 반환 할 수 있습니다. 네트워크 속도가 느리고 시간이 초과 될 수 있습니다. 서버 오류가 발생할 수 있습니다. js 오류가 발생할 수 있습니다. 논리 오류가 있고 대상 요소가 존재하지 않습니다. 요청이 완료되었습니다. –

1

, 당신은 WebWorkers 느릅 나무는 달리 매우 빠르게 사용할 수 있습니다 당신은 jQuery를 $.when()setTimeout 사용해야합니다. 물론 웹 소켓을 사용할 수 있지만 익숙하지 않은 경우 성능을 향상시켜야하는 솔루션이 있습니다.

$(function() { 
    function refresh_bal(){ 
     return $.get('./php/get_balance.php', function(balance) { 
      $('.balance').html(balance); 
     }); 
    } 

    function refresh_total(){ 
     return $.get('./php/get_total_bets.php', function(total) { 
      $('.total').html(total); 
     }); 
    } 

    function refresh_profit(){ 
     return $.get('./php/get_profit.php', function(profit) { 
      $('.profit').html(profit); 
     }); 
    } 

    function refresh_site(){ 
     return $.get('./php/get_site.php', function(site) { 
       $('.siteStats').html(site); 
      }); 
    } 

    function refresh_client() { 
     return $.get('./php/get_client.php', function(client) { 
      $('.clientShow').html(client); 
     }); 
    } 

    function refresh_server() { 
     return $.get('./php/get_server.php', function(server) { 
      $('.serverShow').html(server); 
     }); 
    } 

    (function refresh() { 
     $.when(refresh_bal(), refresh_total(), refresh_profit(), refresh_site(), refresh_client(), refresh_server()).then(function() { 
      setTimeout(refresh, 1000); 
     }); 
    })(); 

     $('.ha').on('click', function() { 
      var refresh_chat = function() { 
       $.get('./php/get_chat.php', function(chats) { 
        $('.chats').html(chats); 
        setTimeout(refresh_chat, 1000); 
       }); 
      }; 
     }); 

     $('.haa').on('click', function() { 
      var refresh_bets = function(){ 
       $.get('./php/get_bets.php', function(bets) { 
        $('.betsTable').html(bets); 
        setTimeout(refresh_bets, 1000); 
       }); 
      }; 
    }); 

}); 

또한 이제 모든 PHP 파일을 포함하고 모든 값을 포함하는 JSON 에코 PHP를 단일 아약스 전화를 할 수

편집 할 수 있습니다.

$(function() { 
    (function refresh() { 
     $.getJSON('./php/op.php', function(data) { 
      $('.balance').html(data.balance); 
      $('.total').html(data.total); 
      $('.profit').html(data.profit); 
      ... 
      setTimeout(refresh, 1000); 
     }); 
    })(); 
}); 
관련 문제