0

我无法在 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]);
4

5 回答 5

3

您的

alert(books[0]);

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

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

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

于 2013-04-09T14:02:20.440 回答
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]);
           },
于 2013-04-09T14:02:21.050 回答
1

在调用成功函数之前,您的警报正在执行。也许使用 Promise 看到相同的代码会让事情变得更清楚。

$.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 的正确答案完全相同。

于 2013-04-09T14:20:10.040 回答
0

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

于 2013-04-09T14:01:22.747 回答
0

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

于 2013-04-09T14:02:40.947 回答