Javascript AJAX设置超时的替代方案?

Javascript AJAX设置超时的替代方案?,javascript,php,jquery,json,ajax,Javascript,Php,Jquery,Json,Ajax,我有一个脚本,它使用ajax在我的服务器(godaddy共享主机)上检索视频文件的PHP数据,然后在我的PHP页面上播放排名最高的视频文件,如下所示: <script id="source" language="javascript" type="text/javascript"> $(function refreshscreen () { $.ajax({ url: 'screen

我有一个脚本,它使用ajax在我的服务器(godaddy共享主机)上检索视频文件的PHP数据,然后在我的PHP页面上播放排名最高的视频文件,如下所示:

<script id="source" language="javascript" type="text/javascript">

  $(function refreshscreen () 
  {

    $.ajax({                                      
  url: 'screen.php',                         
  data: "",                      
  pass to api.php

  dataType: 'json',                 
  success: function(data)       
  {
    var id = data[0];
    var name = data[1];   
    var votes = data[2];    
    var video = data[3];
    var image = data[4];

    $('.screen').hide(); $("#video"+id+"").show();

    var whichvideo = "thevideo" + id;
    var videoplay = document.getElementById(whichvideo); 
    var killvideo = document.getElementsByClassName('videobg');


    var allvideos = document.getElementsByClassName("videobg");

    for(var x=0; x < allvideos.length; x++)
    {

    var allvideosid = document.getElementById(allvideos[x]); 

    if ($(allvideos[x]).attr("id") == whichvideo) {
        allvideos[x].play();
    } else {
        allvideos[x].pause(); 
    }

    }

  },
  complete: function() {
  // Schedule the next request when the current one's complete
  setTimeout(refreshscreen, 5000); 
  }
  });
  }); 

$(功能刷新屏幕()
{
$.ajax({
url:'screen.php',
数据:“,
传递到api.php
数据类型:“json”,
成功:功能(数据)
{
变量id=数据[0];
变量名称=数据[1];
var票数=数据[2];
var视频=数据[3];
var图像=数据[4];
$('.screen').hide();$(“#video”+id+).show();
var whichvideo=“thevideo”+id;
var videoplay=document.getElementById(whichvideo);
var killvideo=document.getElementsByClassName('videobg');
var allvideos=document.getElementsByClassName(“videobg”);
对于(var x=0;x

然后是上面提到的screen.php:

<?php

  $host = "localhost";
  $user = "myuserhere";
  $pass = "mypasshere";

  $databaseName = "mydbnamehere";
  $tableName = "mytablenamehere";


  $con = mysql_connect($host,$user,$pass);
  $dbs = mysql_select_db($databaseName, $con);

  $result = mysql_query("SELECT * FROM $tableName ORDER BY votes DESC");       
  $array = mysql_fetch_row($result);                        


  echo json_encode($array);

?>

这一切都很好,当一个新的排名更高的视频被投票时,视频会自动切换,但是,在播放时,视频会定期冻结,完全是随机的。我的猜测是,我们正在使用ajax脚本的setTimeout函数重载服务器,因此我想知道是否有一种方法可以清理此脚本以避免冻结,或者是另一种方法


提前谢谢

我已经清理了代码:

var currentID = -1;

function refreshscreen() {
  $.getJSON('screen.php', data => {
    var topID = data[0];

    // Schedule the next request
    setTimeout(refreshscreen, 5000);

    if (topID === currentID) return; // top rated video hasn't changed

    $('.screen').hide();
    $("#video" + topID).show();

    var pauseID = "thevideo" + currentID;
    var playID = "thevideo" + topID;

    $(".videobg").each(function() {
      if (this.id === pauseID) this.pause();
      if (this.id === playID) this.play();
    });

    currentID = topID;
  });
}

$(document).ready(function () {
  refreshscreen();
});

最大的变化是跟踪当前正在播放的视频,如果没有变化,则立即退出。除此之外,我去掉了所有未使用的变量,并始终使用jQuery。这至少应该更容易调试,并且可能会在启动时修复错误。

请注意,
mysql.*
函数自2013年(在PHP5.5中)起就被弃用,并从PHP7(2015年发布)起被删除。这是因为它们存在严重的安全漏洞。不要使用它们。请考虑切换到一个或多个,以确保您还可以防止:)我知道MySQL函数中的漏洞,并将在不久的将来将我的脚本迁移到MySqLi,谢谢您的关注。为什么会因为服务器过载而冻结视频?你自己主持视频吗?如果是这样的话,那就是你的问题,而不是ajax。否则,当您向自己的无关服务器发出请求时,我不明白为什么来自另一台主机的视频流会冻结。@AmrNoman-我只是假设是这样。我已经看到,发送太多重复的setTimeout请求可能会导致服务器上的回载,我不认为视频本身冻结,而是浏览器本身可能冻结。很难确定地说。另外:互联网速度被排除在问题之外,至少在我这方面,通过验证速度测试。可能是浏览器,一些拦截ajax调用的调试工具可能会导致性能问题。我在使用debugbar时遇到了laravel的问题。这使我的代码得到了很大的清理,但是问题仍然存在。经过进一步调查,实际发生的情况是,每次视频切换时,视频才开始加载。我现在正在寻找一种在页面加载之前预加载所有视频的方法,但是出于我最初问题的目的,我在这里给Chris G一个答案。