【问题标题】:Making Many AJAX Calls from Loop从循环中进行许多 AJAX 调用
【发布时间】:2014-08-25 16:46:23
【问题描述】:

我有一个网页,当提交时,它会将无限数量的项目添加到我们的数据库中。为避免由于提交的项目过多而导致超时,我想改用 jQuery 和 AJAX 调用 Web 服务。

我正在尝试弄清楚如何编写进行这些 AJAX 调用的循环,以便它 A) 允许多线程并且 B) 不会挂起浏览器。

简单的外观可能是这样的:

elementsToProcess.each(function() {
    // TODO: Submit AJAX call for this element
});

但这是否会挂起浏览器,是否允许多线程?

感谢任何提示。

【问题讨论】:

  • 您希望/需要在哪里避免超时?在数据库响应?从发出(太多)并行 ajax 请求?
  • 从您的循环中,您可以创建一个对象或数组(或其他东西),然后将该对象发送到您的服务吗?您的服务可能会中断数据并做出相应的响应。
  • 你在那个循环中做了什么,你真的想要每个元素一个 ajax 调用吗?什么是elementsToProcess,是无限长的数组吗?
  • @Bergi:如果我不使用 AJAX 调用并简单地发布整个页面并一次性处理所有内容,我会超时。我将 AJAX 视为更好的解决方案。

标签: javascript jquery ajax


【解决方案1】:

我相信这个例子说明了你的要求:

var filesSelected = document.getElementById("privateDocs").files;

var progressholders = document.getElementsByClassName("progressholders");

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

    var p = document.createElement("progress");
        p.value = "0";
        p.max = "100";

    var t = document.createElement("span");

    progressholders[i].innerHTML = "";  
    progressholders[i].appendChild(p);
    progressholders[i].appendChild(t);          

    var formData = new FormData();
        formData.append('file', filesSelected[i], filesSelected[i].name);

    UploadDocToServer("upload.php", formData, p, t);                    
}       

实际的ajax函数

function UploadDocToServer (formUrl, formData, progressBar, totalBar) {
  var parent = progressBar.parentNode;

  var ajaxRequest = new XMLHttpRequest();
    ajaxRequest.upload.addEventListener("progress", function(event) {
            totalBar.innerHTML = event.loaded + "bytes of " + event.total + "bytes";
            var percent = (event.loaded / event.total) * 100;
            progressBar.value = Math.round(percent);

        }, false);
    ajaxRequest.addEventListener("load", function(event) {
        progressBar.parentNode.removeChild(progressBar);

        var info = document.createElement("span");
        info.innerHTML = event.target.responseText
        parent.appendChild(info);

    }, false);

    ajaxRequest.addEventListener("error", function() {
        progressBar.parentNode.removeChild(progressBar);

        var info = document.createElement("span");
            info.innerHTML = "Erorr Uploading.";

        parent.appendChild(info);
    }, false);

    ajaxRequest.addEventListener("abort", function() {
        progressBar.parentNode.removeChild(progressBar);

        var info = document.createElement("span");
            info.innerHTML = "Abort called.";

        parent.appendChild(info);
    }, false);

ajaxRequest.open("POST", formUrl);
ajaxRequest.send(formData);

}

【讨论】:

  • 不是上传的进度事件吗?
  • 谢谢,但我不确定我是否理解这一点。你有没有机会提供更多关于UploadDocToServer 正在做什么的细节?另外,我注意到您使用常规的for 循环而不是each()。这不是更束缚了 UI 吗?
  • Jonathan,如果你想要多线程;只需创建一个创建 ajax 请求并在每个循环中使用它的函数(UploadDocToServer)。 Javascript 是匿名的;默认情况下,它不会等到函数完成。所以你一次会有多个 ajax 请求(多线程)。
  • 谢谢。有没有办法知道所有线程何时完成?
  • 我相信是的。您可以在每个循环之前创建一个数组。一旦ajax请求完成;您可以将值推送到该数组。然后你可以创建一个while循环;一旦数组的长度等于您发送的 ajax 请求数;一切都完成了!但是我会一一处理来自服务器的响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 2020-05-01
  • 2021-02-08
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2017-05-16
相关资源
最近更新 更多