每个循环内部都有Ajax调用

时间:2013-12-23 07:14:51

标签: javascript php ajax

我发现了很多关于此主题的帖子。但我找到的解决方案并不适合我。一些专家建议改变代码结构,但我不知道我该怎么做。

我想要的是什么:
1)从SQL数据库中获取电影列表
2)从每个电影的网站获取信息

我遇到的问题: PHP MAX_TIMEOUT发生。

解决方案我想:分别为每部电影调用异步请求

瓶颈:太多异步请求

请问您如何实施(如果可能只有JS,请不要jquery)?

来自网络的一些解决方案:

1)使用ASYNC = FALSE ....我不想使用SYNC req,无意义使用Ajax然后
2)收集所有数据,然后进行一次Ajax调用......好吧,我先做了..但它是一个很长的脚本(从网上获取电影信息),所以最终导致PHP MAX_TIMEOUT
3)增加PHP MAX_TIMEOUT ......不可行,我不知道要增加多少。

JS

function loadData(mArray){
    mArray = [{"movieid":"1","title":"10 Things I Hate About You"},{"movieid":"2","title":"100 Girls"}]; // TO SIMLYFY, I PUT THIS CODE HERE .. NORMALLY I GET THIS ARRAY USING ANOTHER AJAX CALL
    for (var i = 0; i < mArray.length; i++) { 
        var obj = mArray[i];
        webAjaxcall(obj["mid"],obj["title"]);  // DEFINITELY NOT A GOOD IDEA
    }
    return true;
}

function webAjaxcall(mid,title){
    var xmlhttp=new XMLHttpRequest();
    xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            //DO SOMETHING
        }
    }
    xmlhttp.open("POST","file2.php",true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    params = "title="+title+"&mid="+mid;
    xmlhttp.send(params);
}

万一有人想知道我如何填充JS数组:

文件1

$sql = "SELECT `movieid`,`title` FROM movielist";
    $result = mysql_query($sql) or die(mysql_error());
    while($row=mysql_fetch_assoc($result)){
    $output[] = $row;
    }
    exit(json_encode($output));

文件2

$json=file_get_contents("http://www.website.com/?t=".rawurlencode($moviename));
$info=json_decode($json);
DO SOMETHING

获取电影的AJAX

var xmlhttp=new XMLHttpRequest();
var myarr;
xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
        myarr = xmlhttp.responseText;
        loadData(JSON.parse(myarr));
    }
}
xmlhttp.open("POST","file1.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
params = "fname=<?php echo $ses_id;?>";
xmlhttp.send(params);

1 个答案:

答案 0 :(得分:4)

注意: ASYNC = FALSE表示同步,这意味着一切都将按顺序发生,一次调用等待前一次,最终导致阻止代码。

解决方案/意见:假设您提取数据的网站(或API)无法在单个请求中处理多个结果,那么您将能够处理此问题的唯一方法循环ajax请求的大小是将ajax结果直接缓存在SQL db中:

<强> ::pseudo-architecture::

我们假设以下PHP文件:

<强>的index.php

  • 显示结果
  • 处理循环逻辑以使用单个SQL查询显示电影
  • 未缓存的结果显示“加载”指示符
  • 编写一个$(document).ready()函数,循环遍历所有“未缓存”电影,异步调用 get.php ,每个条目都有适当的GET参数已经缓存了。这样,它不会影响页面加载时间,因为它在页面加载后发生。

::pseudocode::

for movie in movies
    if object has cached data and date retrieved is less than [some time ago]
        return data from SQL db
    else
        display a "caching in progress" notification for that title
        send GET request to get.php

注意:根据服务器的强大程度,您可能需要将请求排队/延迟到get.php,以免一次运行1000个单独的线程。

<强> get.php

::pseudocode::

send 200 ok status code and connection-close header
get $_GET parameters
retrieve API data for your movie by sending $_GET parameters
cache to your SQL db once data is returned

最终,页面会实时加载,并且为了查看新数据,您需要刷新页面(或者如果您想获得真正的幻想,请使用WebSockets做一些通知客户端的内容)。