如何计算for循环中ajax响应数据集的总数?

时间:2015-05-14 20:12:24

标签: javascript ajax

我在文本框中调用ajax并输出api响应。我想要计算收到的数据集总数(counteri),并在每次单击按钮时显示它。例如,如果我第一次点击按钮我想要一个警报显示counteri = 20,下次我点击按钮它显示counteri = 40和... counteri = 60。

目前我的代码每次都显示20,而不是添加值。任何人都可以告诉我如何解决这个问题。谢谢

 <script>
            var maxnumId = null;
            var counteri= null;
            function callApi() {
                $.ajax({
                    type: "GET",
                    dataType: "jsonp",
                    cache: false,
                    url: "https://api.somesite.com/......"),
                    success: function(data) {
                  maxnumId = data.pagination.next_num_id;

               for (var i = 0; i < 100; i++) {

$(".galaxy").append("<div class='galaxy-placeholder'><a target='_blank' href='" + data.data[i].link +"'><img class='galaxy-image' src='" + ok.images.standard_resolution.url +"' /></a></div>"); 

                     document.myform.outputtext.value = document.myform.outputtext.value+data.data[i].images.ok.url+'\n' ;
                        //alert('www!'+i);  
                       counteri=i;
                    }

                    }

                });
              counteri=counteri+counteri;     
                alert('counteri is now: ' + counteri);
            }
            </script>
            <body>
            <br>
            <center>
            <div id="myDiv"></div>
        <div class="galaxy"></div>
            <button id="mango" onclick="callApi()">Load More</button>

            </html>

修改 在成功开始时添加此内容会增加来自ajax响应的记录总数

var num_records = Object.keys(data.data).length;
num_records2=num_records2+num_records;
alert('number of records:'+ num_records2);

var num_records2 =null; // outside function

4 个答案:

答案 0 :(得分:1)

Ajax是异步调用。

将警报移至for之后。不在成功回调之外。

答案 1 :(得分:0)

问题是您将counteri设置为i的值,而不是添加i的值。试试这个:

counteri += i;

答案 2 :(得分:0)

Ajax调用是异步的。你应该在成功时增加你的计数器,而不是在ajax调用之外。像这样:

        function callApi() {
          $.ajax({
            type: "GET",
            dataType: "jsonp",
            cache: false,
            url: "https://api.somesite.com/......",
            success: function(data) {
              maxnumId = data.pagination.next_num_id;

              for (var i = 0; i < 100; i++) {
                document.myform.outputtext.value = document.myform.outputtext.value+data.data[i].images.ok.url+'\n' ;
              }
              counteri=counteri+i;     
              alert('counteri is now: ' + counteri);
            }
          });
        }

答案 3 :(得分:0)

考虑到你的ajax请求成功执行,为了获得你想要的东西,你需要在i循环之前声明for ( ....)变量,如下面的脚本:

var counteri = 0;
function callApi() {
          $.ajax({
            type: "GET",
            dataType: "jsonp",
            cache: false,
            url: "https://api.somesite.com/......",
            success: function(data) {
                var i,
                    maxnumId = data.pagination.next_num_id;
              for (i = 0; i < 100; i++) {
                document.myform.outputtext.value = document.myform.outputtext.value+data.data[i].images.ok.url+'\n' ;
              }
              counteri=counteri+i;     
              alert('counteri is now: ' + counteri);
            }
          });
        }

Please ses here demo

修改

如果在i循环之前没有声明变量for(...)并且工作正常,我还要重新检查。因此,唯一的解决方法是从counter=i循环移除for(...)并将counteri=counteri+counteri;更改为counteri+=i;

考虑到ajax请求会产生许多您可以订阅的不同事件。根据您的需要,您可以组合此事件以完成所需的行为。完整的ajax事件列表解释为here

<强> EDIT2

阅读完评论后,我发现您需要全局i的最后一个值, 您需要添加第二个全局变量,并在所有ajax请求期间保留最后i的总和。 要做到这一点,id添加了一个小的更改来回答:

var counteri = 0,
    totali =0;
function callApi() {
          $.ajax({
            type: "GET",
            dataType: "jsonp",
            cache: false,
            url: "https://api.somesite.com/......",
            success: function(data) {
                var i,
                    maxnumId = data.pagination.next_num_id;
              for (i = 0; i < 100; i++) {
                document.myform.outputtext.value = document.myform.outputtext.value+data.data[i].images.ok.url+'\n' ;
              }
              counteri = i;
              totali = totali + i;     
              alert('totali is now: ' + totali );
            }
          });
        }

JSFiddle demo

编辑3

在您的最后一条评论之后,您需要在API响应中添加返回的行数。为此,您需要将for (i = 0; i < 100; i++) {更改为以下内容:

var num_records = data.num_rows;
for (i = 0; i < num_records ; i++) {

或者,不添加响应中的行数

var num_records = Object.keys(data.data).length;
for (i = 0; i < num_records ; i++) {