2013-12-23 45 views
5

我發現了很多與這個話題的職位。但我發現的解決方案並不適合我。一些專家建議改變代碼結構,但我不知道我該怎麼做。Ajax調用每個循環內

我想要什麼:
1)獲取的電影列表從SQL數據庫
2)獲取來自網站的信息,每部電影

問題,我面對: PHP MAX_TIMEOUT發生。

解決方案心想:調用異步REQ每部電影,分別

瓶頸:太多異步請求

能否請您指點如何實現(如果可能的話只有JS,不是jQuery的請)?

從網上的一些解決方案:

1)使用異步= 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數組:

FILE 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)); 

FILE 2

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

Ajax獲得MOVIELIST

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); 
+0

當你調用你的loadData函數?在窗口加載或其他東西? – Manwal

回答

4

注:ASYNC = FALSE意味着同步,這意味着一切都會按順序發生,一個呼叫等待上,最終導致阻止代碼。

解決方案/意見:假設您正在提取數據的網站(或API)無法在單個請求中處理多個結果,那麼您將能夠處理這一卷循環阿賈克斯的唯一方法請求是直接在你的SQL數據庫緩存AJAX結果:

::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 

最終,頁面加載拋出的這個連接緊密儘快(see how to do that)

  • 思考並且爲了查看新的數據,您需要刷新頁面(或者如果您想獲得真正的幻想,請通過WebSockets通知客戶端)。

  • +0

    謝謝r3mus .. 1)對了,這就是爲什麼我不想使用SYNC請求... 2)我編輯並試圖使它更簡單,如果它發生在實際中。然而,主要關心的是我有說1000電影收集數據,我必須一個接一個地做.... 3)API不處理多個結果在一個單一的請求。你提出的解決方案對我來說並不困難,但我會盡力去理解和實施。謝謝。 ... – abdfahim

    +0

    1)好的,所以你實際上需要'async = true';)2)仍然複雜,但考慮到解決方案,我不認爲你的例子需要更清晰3)我會看看我是否可以擴展僞造使其更加清晰。 – brandonscript

    +0

    好的,更新 - 希望能讓它更清楚一點。 – brandonscript