2013-04-09 96 views
0

如果我在將數據插入數組後正常提示信息,但我在ajax調用中將數據存入數組時遇到問題,但如果我在最後執行警告不明。我確信書是在外面宣佈的,所以它不會干涉。Javascript陣列丟失數據

  var books = []; 
     $.ajax({ 
       url: 'getFolderContents.php', 
       dataType: 'json', 
       success: function (data) 
       {  
        for(var i=0;i<data.length;i++) { 
         var amm = 0; 
         if(data[i].indexOf(".epub") !== -1) { 
          //$('#bTable').append("<td><a id = '" + data[i] + "' href = 'book.html'><img src = 'book.png' width = '100px'/><br/>" + data[i] + "</a></td>"); 
          books.push(data[i]); 
          //alert(books[0]) Works if I call it from here, but not at the end. 
         } 
        } 
       }, 
       error: function() 
       { 
       alert("error"); 
       } 
     }); 
     alert(books[0]); 
+2

ajax是異步的,所以實際上是alert(books [0]);可以在ajax填充數組之前調用。您需要在成功方法中打印它。 – 2013-04-09 14:02:09

回答

3

alert(books[0]); 

將Ajax調用運行時被執行,因此不會有在這一點上執行的任何元素呢。 Ajax是異步的 - 當您向PHP腳本發出請求時,腳本會繼續執行。

books的所有操作放入您的success函數中。

另一個提示:從jQuery版本1.8起,您不能再使用參數async: false來創建同步「A」jax調用。你必須使用回調函數。看看the docs for $.ajax

+0

但是如果我想在通話之後立即使用陣列呢?我將不得不將ajax調用放在一個單獨的函數中,以確保它完成或不會工作嗎?謝謝btw :) – Crossman 2013-04-09 14:05:09

+0

如果你想使用數組把所有關於這個數組的操作放到你的'success'函數中(你可以從你的成功函數中調用另一個函數來使代碼更清晰)。 – akluth 2013-04-09 14:06:53

+0

除非使用數組的代碼已經在您的成功處理程序中執行或被調用,否則無法保證數組中存在數據。所以移動AJAX電話並不會真正起到幫助作用。你可以將你想要使用填充數組執行的代碼放入它自己的函數中,並且只需從成功處理函數中調用該函數即可。 – ajp15243 2013-04-09 14:07:53

0

你的AJAX調用是異步的,這就是爲什麼它是不確定的。

3

你的數組沒有丟失任何數據;數據尚未存入。 'A'代表「異步」,這意味着您的成功回調在您撥打警報時尚未運行。

把警報回調裏面,而不是:

 success: function (data) 
      {  
       for(var i=0;i<data.length;i++) { 
        var amm = 0; 
        if(data[i].indexOf(".epub") !== -1) { 
         //$('#bTable').append("<td><a id = '" + data[i] + "' href = 'book.html'><img src = 'book.png' width = '100px'/><br/>" + data[i] + "</a></td>"); 
         books.push(data[i]); 
         //alert(books[0]) Works if I call it from here, but not at the end. 
        } 
       } 
       alert(books[0]); 
      }, 
0

警報在結束了ajax成功回調之前發生,因爲AJAX是異步的。

1

您的警報在調用成功函數之前執行。也許使用承諾看到相同的代碼會使事情更清楚。

$.ajax(url: 'getFolderContents.php', dataType: "json" ) 
//the then function's first argument is the success handler 
    .then(function(data) { 

     for(var i=0;i<data.length;i++) { 
         var amm = 0; 
         if(data[i].indexOf(".epub") !== -1) { 
          //$('#bTable').append("<td><a id = '" + data[i] + "' href =      'book.html'><img src = 'book.png' width = '100px'/><br/>" + data[i] + "</a></td>"); 
          books.push(data[i]); 
          //alert(books[0]) Works if I call it from here, but not at the end. 
         } 

alert(books[0] 
        }); 

}); 

我總是覺得這個語法使異步的東西更有意義。否則,此代碼的功能與Blazemonger的正確答案完全相同。