【问题标题】:How define max connections in javascript如何在javascript中定义最大连接数
【发布时间】:2014-02-09 00:25:12
【问题描述】:

我有一个发送 AJAX 请求的循环,它适用于大约 5 个文件,但是当我尝试上传超过 5 个文件时。浏览器停止。

有什么方法可以创建或定义最大数量的同时连接,并在它们完成后启动另一个?

for (i=0;i<=files.length;i++) {

var http = new XMLHttpRequest();
var data = "type=ZIP&file=" + base_64_encode(files[i]);

http.open("POST", "update.php");
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.send(data);

}

【问题讨论】:

  • 每个浏览器都有一个内部限制,它可以建立多少并发连接,无论是总数还是单独到每个域。你不能影响它。
  • 不是一个简单的方法,不。但是,有专门的库来处理这些问题,例如github.com/caolan/async#parallellimittasks-limit-callback

标签: javascript forms connection max send


【解决方案1】:

如果我理解正确,你只是想扼杀他们?您可以通过跟踪并发数量、维护超过最大并发的请求队列以及将回调附加到您的请求以更新当前并发值并触发下一个排队函数(如果适用)来做到这一点:

function throttleFileUploads(files, maxConcurrent) {
  var queue = [];
  var currentlyActive = 0;

  function moreAllowed() { return (currentlyActive < maxConcurrent); }

  function uploadFile(file, callback) {
    currentlyActive += 1;
    var http = new XMLHttpRequest();
    var data = "type=ZIP&file=" + base_64_encode(file);

    http.open("POST", "update.php");
    http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    http.onreadystatechange = function() {
      if (http.readyState == 4) { callback(); }
    };

    http.send(data);
  }

  function finished() {
    currentlyActive -= 1;
    if (moreAllowed() && queue.length) { queue.pop()(); }
  }

  files.forEach(function(file) {
    var action = uploadFile.bind(null, file, finished);
    if (moreAllowed()) {
      action();
    } else {
      queue.push(action);
    }
  });
}

(注意——我没有测试它,但我认为这个想法是合理的。)

throttleFileUploads(files, 5);

【讨论】:

  • 感谢您的快速回复,但显然它不起作用,当然不是他们的代码。显然我使用的文件非常重(8 Mb)。我还有其他想法可以用于这种情况吗?任何可以指导我的链接?事实上,我开始使用 JavaScript 并且非常喜欢它,但这当然还不够。
  • 你能详细说明发生了什么吗?上述代码是否因错误而失败,或者它是否“工作”但上传继续静默失败?
  • 我认为问题出在将文件转换为 base64 时。我想我需要在发送后创建一个要在 base64 中转换的文件列表,在列表中保存名称、大小和类型。然后,从该列表中,我必须将它们转换为 base64 并一次发送一个(以避免使浏览器饱和),并在发送后从该列表中删除它们(为下一个文件腾出空间)。我尝试实现您的代码,但是在转换为 base64 并发送它时,总是先加载 Mb 较少的文件,然后再加载较重的文件(不是按到达顺序)。通过通常(浏览器停止)后。
  • 知道怎么做吗?我阅读了一些关于使用 setInterval 和 clearInterval 在 JavaScript 中模拟线程的内容,但我找不到解决方案。
  • 有些东西告诉我我在附近,但我不知道。
猜你喜欢
  • 2011-07-25
  • 2016-12-29
  • 2018-09-21
  • 2013-04-20
  • 1970-01-01
  • 2019-12-10
  • 2016-09-17
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多