Javascript数组丢失数据

时间:2013-04-09 13:59:48

标签: javascript jquery ajax arrays

我无法在ajax调用中将我的信息放入数组中,如果我在将数据插入数组后立即提醒信息它可以正常工作,但如果我在最后执行此操作则会发出无法识别的警报。我确保书籍在外面宣布,所以它不会干涉。

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

5 个答案:

答案 0 :(得分:3)

alert(books[0]);

将在Ajax调用运行时执行,因此在此执行点上不会有任何元素。 Ajax是异步的 - 当您向PHP脚本发出请求时,脚本会继续执行。

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

另一个提示:从jQuery版本1.8开始,您不能再使用参数async: false来创建同步“A”jax调用。您必须使用回调函数。看看the docs for $.ajax

答案 1 :(得分: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]);
           },

答案 2 :(得分: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的正确答案完全相同。

答案 3 :(得分:0)

您的AJAX调用是异步的,这就是未定义的原因。

答案 4 :(得分:0)

最后的警报发生在ajax成功回调之前,因为ajax是异步的。