同时触发的多个ajax调用无法正常工作

时间:2016-02-16 09:36:13

标签: javascript php jquery ajax

我创建了一个网站,它通过AJAX从多个来源加载每隔几秒钟的数据。但是我遇到了一些奇怪的行为。这是代码:

function worker1() {
    var currentUrl = 'aaa.php?var=1';
    $.ajax({
        cache: false,
        url: currentUrl, 
        success: function(data) {                    
            alert(data)
        },
        complete: function() {
            setTimeout(worker1, 2000);
        }
    });
}

function worker2() {
    var currentUrl = 'aaa.php?var=2';
    $.ajax({
        cache: false,
        url: currentUrl, 
        success: function(data) {                    
            alert(data)
        },
        complete: function() {
            setTimeout(worker2, 2000);
        }
    });
}

问题在于,很多时候,其中一名工人返回NaN。如果我更改了呼叫的频率,比如20001900,那么一切正常,我几乎没有NaN个结果。当这些频率相同时,其中一个呼叫的NaN结果超过80%。似乎浏览器无法处理同时调用的两个请求。我只使用这两个工作者,因此浏览器不应该被AJAX请求重载。问题在哪里?

请注意aaa.php适用于mySql数据库,并根据url中的参数进行一些简单的查询。

2 个答案:

答案 0 :(得分:1)

您需要的只是 $.each 以及 $.ajax

的两个参数形式
var urls = ['/url/one','/url/two', ....];

$.each(urls, function(i,u){ 
     $.ajax(u, 
       { type: 'POST',
         data: {
            answer_service: answer,
            expertise_service: expertise,
            email_service: email,
         },
         success: function (data) {
             $(".anydivclass").text(data);
         } 
       }
     );
});
  

注意:成功回调生成的消息将覆盖   彼此如图所示。你可能想要使用   成功函数中的$(' #divid')。append()或类似内容。

答案 1 :(得分:0)

也许,不要使用这些工作人员而是使用承诺而不是像下面那样?虽然没有查看服务器代码,但无法说明返回的错误。下面是您正在尝试做的工作代码。

这是一个简单的示例,但您可以为每个URL使用不同的解析器和一个对象({url:resolverFunc}),然后使用Object.keys进行迭代。

var urls = [
  'http://jsonplaceholder.typicode.com/users/1',
  'http://jsonplaceholder.typicode.com/users/2',
  'http://jsonplaceholder.typicode.com/users/3',
  'http://jsonplaceholder.typicode.com/users/4',
  'http://jsonplaceholder.typicode.com/users/5',
  'http://jsonplaceholder.typicode.com/users/6',
  'http://jsonplaceholder.typicode.com/users/7'
]

function multiGet(arr) {
  var promises = [];
  for (var i = 0, len = arr.length; i < len; i++) {
    promises.push($.get(arr[i])
      .then(function(res) {
        // Do something with each response
        console.log(res);
      })
    );
  }
  return $.when(promises);
}

multiGet(urls);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>