Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 从多个ajax请求中获取总数_Jquery_Ajax_Asynchronous - Fatal编程技术网

Jquery 从多个ajax请求中获取总数

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:

我试图从多个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: 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的答案在这一点上可能更清晰了。

您可能还需要添加一个错误处理程序,以防任何请求失败,因此您仍然可以减少计数器。否则你永远不会得到一个总值,因为这些请求中的一个(或多个)总是“未完成的”。你可能还想添加一个错误处理程序,以防任何请求失败,因此