我在文本框中调用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
答案 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);
}
});
}
修改强>
如果在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 );
}
});
}
编辑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++) {