【问题标题】:Find resultant of two asynchronous ajax request in xhr onprogress在 xhr onprogress 中查找两个异步 ajax 请求的结果
【发布时间】:2016-06-11 09:22:31
【问题描述】:

我正在尝试在 ajax 请求响应文本中查找图像并获取 src url 以在另一个 ajax 请求中使用。

我需要知道加载每个图像的进度,并在我的进度栏中显示此进度的结果。 但是你可以看到 image1 是否加载了 10%; 和 image2 20%。

我的结果从 20% 下降到 10% 。 我的进度条会后退,然后前进。

有什么帮助吗? 或者这是一个好的解决方案?

parseResult: function(result, navNumber) {
  var self = this;
  var imagesMatter = $(result).find('img');
  var imagesLength = imagesMatter.length;

  // if there is any image in ajax request then fetch imgs using ajax for show progress bar
  if (imagesLength >= 1) {
    var i = 0,
      complete = 0,
      temp = 1;
    navigation.progress.fadeIn(50);

    imagesMatter.each(function() {
      var $this = $(this);
      var URL = $this.attr('src');

      $.ajax({
        url: URL,
        xhr: function() {
          var xhr = new window.XMLHttpRequest();
          xhr.addEventListener("progress", function(evt) {
            if (evt.lengthComputable) {
              var percentComplete = parseFloat(evt.loaded / evt.total).toFixed(1);
              temp = complete + (percentComplete / imagesLength);
              console.log(parseInt(temp * 100) + '%');
              navigation.progress.html(parseInt(temp * 100) + '%');
            }
          }, false);
          return xhr;
        },
        complete: function() {
          complete = temp;
          
          i++;
          if (i == imagesLength) {
            self.closeLoading(navNumber);
          }
        }
      });
    });
  } else {
    return;
  }
}

【问题讨论】:

  • 你不应该在进度回调中设置complete = temp;,而不仅仅是在完成回调中吗?!
  • @amif :如果我理解正确,你想显示两个图像加载的单个进度条,对吧?
  • @amir : 我的代码解决了你的问题吗?
  • @ParagBhayani 是的。完全正确,但我要为所有图像而不是 2 个。(也许将来我有 10 个)和抱歉实际上它增加到 199%,但我需要 0% 到 100%
  • @ParagBhayani 看看这个 -> haveyoumetme.ir/2

标签: javascript jquery ajax progress-bar jqxhr


【解决方案1】:

这里我已经删除了你的完整变量,因为我不明白它的目的是什么,并为每个请求添加了一个局部变量 lastPercent,它将记住它是特定图像请求的最后一个进度百分比,等等新更新我们将添加新的百分比并删除旧的百分比......我希望这个逻辑对你来说很清楚......

parseResult: function(result, navNumber) {
  var self = this;
  var showPercent;
  var imagesMatter = $(result).find('img');
  var imagesLength = imagesMatter.length;

  // if there is any image in ajax request then fetch imgs using ajax for show progress bar
  if (imagesLength >= 1) {
    var i = 0,
      temp = 1;
    navigation.progress.fadeIn(50);

    imagesMatter.each(function() {
      var $this = $(this);
      var URL = $this.attr('src');
      var lastPercent = 0;

      $.ajax({
        url: URL,
        xhr: function() {
          var xhr = new window.XMLHttpRequest();
          xhr.addEventListener("progress", function(evt) {
            if (evt.lengthComputable) {
              var percentComplete = parseFloat(evt.loaded / evt.total).toFixed(1);
              temp = temp + (percentComplete / imagesLength) - lastPercent;
              lastPercent = (percentComplete / imagesLength);
              showPercent = temp/imagesLength;
              console.log(parseInt(showPercent * 100) + '%');
              navigation.progress.html(parseInt(showPercent * 100) + '%');
            }
          }, false);
          return xhr;
        },
        complete: function() {
          i++;
          if (i == imagesLength) {
            self.closeLoading(navNumber);
          }
        }
      });
    });
  } else {
    return;
  }
}

【讨论】:

  • 事实上在这种情况下,我不知道女巫 ajax 请求正在影响临时变量......并且女巫图像加载更多?
  • @AmirRezvani:我没有得到你想要问的内容???你想要 0 到 100% 而这个脚本正在给你,所以无法理解你的期望......
  • 我在我的项目中使用了你的脚本,看起来没问题,但在 0-200% 域中。实际上,在我完全尊重的情况下,这是不对的。 haveyoumetme.ir/2 --> 你可以在这个 url 中找到你的代码
  • @AmirRezvani:我看过你的代码,你使用了新变量 showPercent,因此它仍然会产生问题,我的建议是如果有 4 张图像,那么让它应该从0 到 400,但是当您当时正在显示它时,将其除以 4(imagesLength)...
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多