Jquery 从多个ajax请求中获取总数
我试图从多个ajax请求的返回中得到一个总数,我现在使用sync使其工作,因为我认为这将是一个更好的解决方案 这是我的咖啡Jquery 从多个ajax请求中获取总数,jquery,ajax,asynchronous,Jquery,Ajax,Asynchronous,我试图从多个ajax请求的返回中得到一个总数,我现在使用sync使其工作,因为我认为这将是一个更好的解决方案 这是我的咖啡 get_total = (trend, duration) -> total = 0 for keyword in trend.search_terms url = "http://otter.topsy.com/search.json?q=#{keyword}&window=#{duration}" $.ajax url:
get_total = (trend, duration) ->
total = 0
for keyword in trend.search_terms
url = "http://otter.topsy.com/search.json?q=#{keyword}&window=#{duration}"
$.ajax
url: url
async: false
success: (data) ->
total += data.response.total
total
很好地编译为
get_total = function(trend, duration) {
var keyword, total, url, _i, _len, _ref;
total = 0;
_ref = trend.search_terms;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
keyword = _ref[_i];
url = "http://otter.topsy.com/search.json?q=" + keyword + "&window=" + duration;
$.ajax({
url: url,
async: false,
success: function(data) {
return total += data.response.total;
}
});
}
return total;
};
get_total=函数(趋势、持续时间){
var关键字,总计,url,_i,_len,_ref;
总数=0;
_ref=趋势搜索\术语;
对于(_i=0,_len=_ref.length;_i<_len;_i++){
关键字=_ref[_i];
url=”http://otter.topsy.com/search.json?q=“+关键字+”&窗口=“+持续时间;
$.ajax({
url:url,
async:false,
成功:功能(数据){
返回总计+=data.response.total;
}
});
}
返回总数;
};
有没有一种方法可以在不使用同步js的情况下完成全部工作
我一直在试验$.when().then(),但当请求的大小是动态的时,它会导致问题。当然,但您需要添加一些状态跟踪,以确定所有ajax请求何时返回,然后调用函数传递生成的总数。如果您切换到异步请求,那么在ajax请求被激发后,将立即返回“total”,此时可能只有0个或几个请求返回,因此您将得到不正确的总数
var requestsOutstanding = 0;
var total = 0;
for (i = 0; i < _ref.length) {
keyword = _ref[i];
url = "...";
requestsOutstanding++;
$.ajax({
url: url,
async: true,
success: function(data) {
total += data.response.total;
requestsOutstanding--;
if (requestsOutstanding == 0) {
totalResultIsAvailable(total); // trigger next stage of events here
}
}
});
}
var requestsOutstanding=0;
var合计=0;
对于(i=0;i<_参考长度){
关键字=_ref[i];
url=“…”;
requestsOutstanding++;
$.ajax({
url:url,
async:true,
成功:功能(数据){
总计+=data.response.total;
请求支持--;
if(requestsOutstanding==0){
totalResultIsAvailable(total);//在此处触发事件的下一阶段
}
}
});
}
当然可以,但您需要添加一些状态跟踪,以确定所有ajax请求何时返回,然后调用函数传递生成的总数。如果您切换到异步请求,那么在ajax请求被激发后,将立即返回“total”,此时可能只有0个或几个请求返回,因此您将得到不正确的总数
var requestsOutstanding = 0;
var total = 0;
for (i = 0; i < _ref.length) {
keyword = _ref[i];
url = "...";
requestsOutstanding++;
$.ajax({
url: url,
async: true,
success: function(data) {
total += data.response.total;
requestsOutstanding--;
if (requestsOutstanding == 0) {
totalResultIsAvailable(total); // trigger next stage of events here
}
}
});
}
var requestsOutstanding=0;
var合计=0;
对于(i=0;i<_参考长度){
关键字=_ref[i];
url=“…”;
requestsOutstanding++;
$.ajax({
url:url,
async:true,
成功:功能(数据){
总计+=data.response.total;
请求支持--;
if(requestsOutstanding==0){
totalResultIsAvailable(total);//在此处触发事件的下一阶段
}
}
});
}
我不知道CoffeeScript,所以这里有一个纯jQuery解决方案:
如果不进行同步调用,则无法从get\u total
返回值。您可以做的是在所有请求完成后调用回调
此示例使用jQuery的:
如果需要get_total
返回值,则必须进行同步调用。一般来说,这是一个坏主意,尤其是当您发出多个请求时。它将冻结浏览器的UI。最好重新构造代码以处理回调
更新:我刚读了你问题的最后一句话。可以使用向函数传递动态数量的参数
更新2:当然,如果您可以控制该服务,您应该让它接受多个关键字以避免多个Ajax请求。我不知道CoffeeScript,因此这里有一个纯jQuery解决方案: 如果不进行同步调用,则无法从
get\u total
返回值。您可以做的是在所有请求完成后调用回调
此示例使用jQuery的:
如果需要get_total
返回值,则必须进行同步调用。一般来说,这是一个坏主意,尤其是当您发出多个请求时。它将冻结浏览器的UI。最好重新构造代码以处理回调
更新:我刚读了你问题的最后一句话。可以使用向函数传递动态数量的参数
更新2:当然,如果您可以控制该服务,您应该让它接受多个关键字以避免多个Ajax请求。我不知道coffeescript,但要在js中实现这一点,您可以使用一个闭包:
var total_trend = (function() {
var total = 0,
num_adds = 0;
return {
add_to_total: function(add) { total += parseInt(add, 10); num_adds += 1; },
get_total: function() { return total; },
get_deferred_total: function(expected, callback) {
if(num_adds !== expected) {
var _this = this;
setTimeout(function(){ return _this.get_deferred_total(expected, callback); }, 100);
} else {
callback(total);
}
}
};
})();
将其定义为回调可以访问的变量,然后在ajax回调中执行以下操作:
total_trend.add_to_total(data.response.total);
当你想要总数时:
total_trend.get_total();
如果您想将总数推迟到add_to_total拥有给定数量的呼叫时:
var expected_num_calls = 5;
total_trend.get_deferred_total(expected_num_calls, function(total) { alert(total); } )
在上述情况下,调用add_to_total 5次后,将调用回调函数
编辑:正如Felix指出的,原始版本不支持等待ajax调用完成。代码已更新,以支持推迟总计。这应该行得通,但Felix的答案在这一点上可能更清晰了。我不知道coffeescript,但要在js中实现这一点,可以使用一个闭包:
var total_trend = (function() {
var total = 0,
num_adds = 0;
return {
add_to_total: function(add) { total += parseInt(add, 10); num_adds += 1; },
get_total: function() { return total; },
get_deferred_total: function(expected, callback) {
if(num_adds !== expected) {
var _this = this;
setTimeout(function(){ return _this.get_deferred_total(expected, callback); }, 100);
} else {
callback(total);
}
}
};
})();
将其定义为回调可以访问的变量,然后在ajax回调中执行以下操作:
total_trend.add_to_total(data.response.total);
当你想要总数时:
total_trend.get_total();
如果您想将总数推迟到add_to_total拥有给定数量的呼叫时:
var expected_num_calls = 5;
total_trend.get_deferred_total(expected_num_calls, function(total) { alert(total); } )
在上述情况下,调用add_to_total 5次后,将调用回调函数
编辑:正如Felix指出的,原始版本不支持等待ajax调用完成。代码已更新,以支持推迟总计。这应该是可行的,但是Felix的答案在这一点上可能更清晰了。您可能还需要添加一个错误处理程序,以防任何请求失败,因此您仍然可以减少计数器。否则你永远不会得到一个总值,因为这些请求中的一个(或多个)总是“未完成的”。你可能还想添加一个错误处理程序,以防任何请求失败,因此