簡體   English   中英

每個循環內的Ajax調用

[英]Ajax call inside each loop

我發現了很多與此主題相關的帖子。 但是我發現的解決方案並不適合我。 一些專家建議更改代碼結構,但是我不確定該怎么做。

我想要的是:
1)從SQL數據庫獲取電影列表
2)從網站上獲取每部電影的信息

我遇到的問題:發生PHP MAX_TIMEOUT。

我認為的解決方案:分別為每部電影調用異步請求

瓶頸:異步請求過多

您能建議如何實現嗎(如果可能的話,只使用JS,而不是jquery)?

網絡上的一些解決方案:

1)使用ASYNC = FALSE ....我不想使用SYNC req,沒有必要再使用Ajax
2)收集所有數據,然后一次調用Ajax ...好吧,我首先這樣做了..但這是一個長腳本(從Web上獲取電影信息),因此最終導致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);

注: ASYNC = FALSE 同步裝置,該裝置一切都會按順序發生,一個呼叫等待阻斷代碼前面,最終的結果。

解決方案/意見:假設您要提取數據的站點(或API)無法在單個請求中處理多個結果,則能夠處理此數量的循環ajax請求的唯一方法是緩存ajax結果直接在您的SQL數據庫中:

::pseudo-architecture::

讓我們假設以下PHP文件:

index.php

  • 顯示結果
  • 處理循環邏輯以使用單個SQL查詢顯示電影
  • 未緩存的結果顯示“正在加載”指示器
  • 編寫一個$(document).ready()函數,該函數循環遍歷所有“未緩存”的電影,並為尚未緩存的每個條目以適當的GET參數異步調用get.php 這樣,它不會影響頁面加載時間,因為它是在頁面加載后發生的。

::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通知客戶端)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM