javascript - 如何知道 nsIWebBrowserPersist 下载何时完成? (火狐 30、Javascript)

标签 javascript download firefox-addon status http-status-codes

当我在“onStateChange”中检查 (thisRequestStatus == 200) 时,这似乎不仅在图像下载完成时触发,而且在下载一个 URL 的过程中经常触发两次或更多次。 (infoElementCurrentURL 中的文本过早地运行到最后一个 URL。)

我只想触发该代码一次,因此它一次只下载 1 个图像,而不是同时下载两个或更多图像。 (我有一个更长的 URL 列表,尽管这里我只输入了 5 个 URL。)

如何知道使用 nsIWebBrowserPersist 下载何时完成?

Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
const WebBrowserPersist = Components
    .Constructor("@mozilla.org/embedding/browser/nsWebBrowserPersist;1",
                                                 "nsIWebBrowserPersist");
var progressElement = cd.getElementById("id:sp:downloadProgressInfo");
var infoElementCurrentURL = cd.getElementById("id:sp:downloadInfoCurrentURL");
var urlArrayFinal = ["https://farm4.staticflickr.com/3745/13112412145_590436f5f0_o.jpg"
,"https://farm4.staticflickr.com/3799/13112697234_fe0db6aa59_o.jpg"
,"https://farm3.staticflickr.com/2870/13112697464_c401657ec1_o.jpg"
,"https://farm8.staticflickr.com/7005/6582177439_8777d33c95_o.jpg"
,"https://farm8.staticflickr.com/7025/6582206291_853b99e6dc_o.jpg"
,"https://farm8.staticflickr.com/7148/6582203143_d7d627f95a_o.jpg"];
function downloadImage(theURL) {
    infoElementCurrentURL.innerHTML = '' + urlArrayFinal.length + ': ' + theURL;
    var persist = WebBrowserPersist();
    var targetFilePathName = "C:\\\\zttest\\"+theURL.substr(theURL.lastIndexOf('/')+1);
    var obj_URI = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService)
        .newURI(theURL, null, null);
    var targetFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
    targetFile.initWithPath(targetFilePathName);
    if(!targetFile.exists()) {
      targetFile.create(0x00,0644);
    }
    var privacy = null;
    persist.progressListener = {
      onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {
        var percentComplete = Math.round((aCurTotalProgress / aMaxTotalProgress) * 100);
        progressElement.textContent = '' + percentComplete +"%";
      },
      onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
        try {var httpChannel = aRequest.QueryInterface(Components.interfaces.nsIHttpChannel);
          var thisRequestStatus = httpChannel.responseStatus;
          var thisRequestLength = httpChannel.getResponseHeader("Content-Length");
        } catch(ex) {
        }
        if (thisRequestStatus == 200) {
            progressElement.textContent = thisRequestStatus;
            if (urlArrayFinal.length>0) { window.setTimeout(downloadImage(urlArrayFinal.pop(), 100)); }
        }
      }
    }
    persist.saveURI(obj_URI, null, null, null, "", targetFile, privacy);
}

if (urlArrayFinal.length>0) { downloadImage(urlArrayFinal.pop()); }

最佳答案

onStateChange 是可行的方法,但是您需要检查 aStateFlags 实际上是 Ci.nsIWebProgressListener.STATE_STOP .

因此,遵循以下内容即可解决问题:

onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
  if (!(aStateFlags & Ci.nsIWebProgressListener.STATE_STOP)) {
    // Not done yet
    return;
  }
  if (urlArrayFinal.length>0) {
    setTimeout(downloadImage(urlArrayFinal.pop(), 100));
  }
}

请注意,检查是否是 HTTP 200 响应是不够的,而且逻辑也不正确。例如。当您收到 404 错误时,下载将停止,而不加载其他图像。

关于javascript - 如何知道 nsIWebBrowserPersist 下载何时完成? (火狐 30、Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24702436/

相关文章:

javascript - onclick 必须点击两次才能触发

c - 是否可以使用 Azure IoT 中心和 Blob 存储进行固件更新?

C# 从目录下载文件并运行它

java - 如何从 Java 应用程序连接到 Cisco Show and Share API

firefox-addon - 自定义附加安装程序

javascript - 使用JQuery获取文本框中的光标位置

javascript - req.flash 不是 Nodejs 的函数

javascript - 需要一个并行指令 Controller ,无需创建父 Controller

php - 浏览器要求我下载 php 文件

javascript - 无法在 firefox 扩展中加载 oauth.io (oauth.js)