【问题标题】:AJAX call inside a loop. Only one request gets completed循环内的 AJAX 调用。只有一个请求完成
【发布时间】:2016-04-19 15:02:12
【问题描述】:

所以我使用 AJAX 多次点击一个 url,我面临的问题是即使代码应该完成多个请求,也只有一个 AJAX 请求完成。我在终端中运行了以下代码:

var item_arr = ['a','b'];

item_arr.forEach(function(item_name){

$.ajax({url:'https://example.com:port/',
type:'POST',
data:{ 'item':item_name },
    success:function(res){
    console.log(res);
    }
});

});

我主要想问的是:

  • 这段代码有什么问题吗?
  • 或者对特定 url 的并行请求数量是否有限制(只有两个)

另外,我正在使用 NODEJS(request) 来构建应用程序,我只是使用 jquery 检查它是否在 jquery 中工作,但是这两种技术在这个问题上的表现相似。

更新: 正如 Rion 建议的那样,我比较了成功和不成功请求的 curl 请求。成功命中的标题如下所示:

'Origin: http://evil.com/'
'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.8'
'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.87 Chrome/49.0.2623.87 Safari/537.36'
'Content-Type: application/x-www-form-urlencoded'
'Accept: */*'
'Referer: http://stackoverflow.com/questions/33243685/nodejs-a-better-way-to-handle-ajax-request-to-the-server'
'Connection: keep-alive'

而对于不成功的请求有以下标头:

'Accept: */*' 
'Referer: http://stackoverflow.com/questions/33243685/nodejs-a-better-way-to-handle-ajax-request-to-the-server'
'Origin: http://stackoverflow.com'
'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.87 Chrome/49.0.2623.87 Safari/537.36'
'Content-Type: application/x-www-form-urlencoded'

Accept-Encoding 有什么不同吗?

【问题讨论】:

    标签: javascript jquery ajax node.js loops


    【解决方案1】:

    这段代码有什么问题吗?

    您的实际代码似乎没有任何问题,例如,在this example fiddle 中可以看到执行相同操作的示例并且工作正常:

    // Define your values
    var item_arr = ['a','b'];
    
    $(function(){
        // Loop through them
        item_arr.forEach(function(item_name){
          // Post each one (JSFiddle URL for example purposes)
          $.post('/echo/html/', { 'item':item_name }, function(){
            alert(item_name);
          });
        });
    });
    

    如果这不起作用,那么我倾向于认为您发布到的 URL 有问题(即结果可能没有成功返回)。

    或者对特定的并行请求的数量是否有限制 url(只有两个)?

    这可能会有所不同,因为某些浏览器/网络服务器可能会限制来自同一主机名的并发连接数,但是由于您创建的数量很少,这应该不是问题。您可以通过显式禁用 AJAX 调用的缓存来检查是否存在缓存问题:

    cache: false
    

    您可能需要考虑在浏览器中使用开发者工具 (F12) 来查看每个请求/响应的外观,以确保它们正常工作:

    【讨论】:

    • 嗨,Rion,感谢您的快速回复。我也检查了我的服务器端,我注意到当我运行此代码时,我的服务器端代码显示“正在向客户端发送一些 json”。但是客户端似乎并没有全部收到。虽然,我尝试单独运行每个请求并且它们工作得很好。另外,由于我使用的是nodeJS,我认为缓存应该不是问题?
    • 您可以尝试在成功回调中放置debugger,并在开发者工具执行时保持打开状态。这将允许您深入了解您的响应,以查看您是否可能需要以不同的方式提取您的响应数据(有时您必须使用res.d 来访问数据)。关于cache,它可能并不一定与你的情况有关,但对于大量使用它的场景来说,值得一提。
    • Rion,请您看一下问题描述。我已经更新了这个问题。评论部分不允许有太多字符。
    • 另外,我刚刚对失败的请求使用了 Replay XHR 功能,它运行良好。但是在循环中使用时它不起作用。
    • 您可以尝试通过dataType: 'json'dataType 属性设置为json,看看这是否会对您的AJAX 调用产生影响。此外,您是否尝试过查看请求是否作为查询字符串工作(即将'?item=' + item_name 附加到您的 URL 以查看是否有效。
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2016-07-03
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多