2016-08-17 57 views
2

我做了一個個人項目,我可以在搜索欄中輸入電影標題並獲取有關它們的信息。數據在使用omdb的api的json中。下面是代碼的主要部分:在動態創建的div中創建分區

//film[] is an array of strings contains movie titles 

//this array works perfectly giving me 0 through lenght-1 elements 
for(var i= 0; i< film.length; i++) 
    console.log(i+" : "+film[i]); 
console.log("Film you entered is "+ film); 

//#load is section element that is use to display "loading" while the data is recieved 
$('#load').html("<h2>LOadiNG.....................</h2>"); 

//looping for each movie 
for(var j= 0; j< film.length; j++){ 
    $.getJSON("http://www.omdbapi.com/?t="+film[j]+"&y=&plot=short&r=json", function(json) { 

     //does not work if I give 3 titles, shows "processing 3 : undefined" all the time 
     console.log("processing "+j+" : "+film[j]); 

     /* 
     *#info is section element where the data is displayed 
     *".for-info" styles each div child inside section so that each movie has a visible seperation 
     *(this is what I want) 
     */ 
     $("#info").append("<div id="+j+" class='for-info'></div>"); 
     $('#load').empty(); 

     //append each key-value in its particular div 
     for(val in json) 
      $("#"+j).append('<p>'+val+' --> '+json[val]+'</p>'); 
     $("#"+j).append("<p><br/></p>"); 
}); 

所以我的問題是如何創建使用DIV使得每個電影數據是1個特別部分師?另外我注意到,有時候索引較高的電影會在較低索引之前被檢索出來。當我使用循環來控制它時,這怎麼可能?

+2

可以,因爲它使用異步方法,有時意爲檢索結果可能需要更長的等待時間大約一個電影具有更高的索引檢索數據和結果可能會略有不同的順序(被退回,因爲代碼繼續,而不是停止並等待返回的值,然後繼續)。爲了避免這種情況,可能需要將數據抓取到本地數組,並且一旦完成迭代該數組。 –

+2

'getJSON()'是_asynchronous_,所以您可能會以不同於發送請求的順序獲得您的響應。 – dave

回答

1

作爲的WhiteHat說得好,$ .getJSON是異步的,不能保證在另一個之前將完成。你也可以在$ .getJSON完成之前看到'j'的值發生了變化。

如果要確保getJSON同步運行,可以使用promises

在jQuery 1.5中,Ajax方法返回promise。返回值包含getJSON完成時運行的.done(),.always()和.fail()方法。

function processFilms (film, i) { 
    if(!i) i = 0; 
    if (film && i >= 0 && i < film.length){ 
     $.getJSON("http://www.omdbapi.com/?t="+film[i]+"&y=&plot=short&r=json") 
     .done(
     function (json) { 
      console.log("processing "+i+" : "+film[i]); 
      $("#info").append("<div id="+i+" class='for-info'></div>"); 
      for(val in json) 
       $("#"+i).append('<p>'+val+' --> '+json[val]+'</p>'); 
      $("#"+i).append("<p><br/></p>"); 
      $('#load').empty(); 
      processFilms(film, i+1); 
     } 
    ); 
    } 
} 

processFilms(['Fast', 'Nemo']); 

注意:其他方法是使用回調函數爲你做遞歸調用。

此外,您可以確保'j'在運行$ .getJSON時不會改變。它是異步的,但'j'不會改變。

for(var j= 0; j< film.length; j++){ 
     (function (j_aux) { 
     $.getJSON("http://www.omdbapi.com/?t="+film[j]+"&y=&plot=short&r=json", function(json) { 
       console.log("processing "+j_aux+" : "+film[j_aux]); 
       $("#info").append("<div id="+j_aux+" class='for-info'></div>"); 
       $('#load').empty(); 
       for(val in json) 
        $("#"+j_aux).append('<p>'+val+' --> '+json[val]+'</p>'); 
       $("#"+j_aux).append("<p><br/></p>"); 
     }); 
     })(j); 
} 
+0

整個問題是,** j **在** getJSON **裏面改變。沒有承諾,我不得不在** getJSON **內部手動設置'j = 0',並在塊結束時增加它。你認爲這種方式以後可能會導致我現在無法預測的問題嗎? – user3762742

+0

如果在getJSON中設置j = 0,那麼在該請求中'j'爲0。但我明白,你希望'j'值是每部電影請求中的索引。如果強制j = 0,並在塊的末尾增加'j',那麼在所有回調的開始處,j值將爲0.在塊的末尾增加'j',在下一次調用時,'j'無動於衷, j'back將被賦值爲0,並且在所有回調期間值不會改變。也許j只能在第一個請求中爲0 – fbohorquez

4

因爲$.getJSON是異步的,不能保證之前,其他

這樣一個將結束,創建和分配div$.getJSON

for(var i= 0; i< film.length; i++){ 
    $('#load').html("<h2>LOadiNG.....................</h2>"); 

    for(var j= 0; j< film.length; j++){ 
     $("#info").append("<div id="+j+" class='for-info'></div>"); 
     $.getJSON("http://www.omdbapi.com/?t="+film[j]+"&y=&plot=short&r=json", function(json) { 
      for(val in json){ 
       $("#"+j).append('<p>'+val+' --> '+json[val]+'</p>'); 
      } 
      $("#"+j).append("<p><br/></p>"); 
      $('#load').empty(); 
     }); 
    } 
} 
+0

問題仍然存在。但我想,我已經能夠明確問題所在。邏輯看起來很好,但問題是循環控制變量** j **。在** getJSON **塊之外,** j **按預期工作,但不在內部。實際上,由於某種原因,** j **的值爲film.length。異步調用與它有關嗎? – user3762742

+0

問題修復。在** getJSON **函數內部使用'if(j == film.length)j = 0;'和'j ++'的塊結尾。似乎工作 – user3762742

0

你可以使用CSS來給你換信息類底部的邊框和邊距,如下所示:

(注意:我使用:not(:last-child)選擇器不將分頻器應用到最後DIV)

.for-info:not(:last-child) { 
 
    border-bottom: 2px solid black; 
 
    margin-bottom: 10px; 
 
} 
 

 
.for-info { 
 
    height: 40px; 
 
    background-color: #c3c3c3; 
 
}
<div id='movie1' class='for-info'>Some content...</div> 
 
<div id='movie2' class='for-info'>Some content...</div> 
 
<div id='movie2' class='for-info'>Some content...</div>

+0

這是我已經做的事情。我得到的部門,但結果是非常隨機的 – user3762742