0

所以基本上发生了什么是:
1)按钮单击
2)返回json arrya的外部请求
3)循环遍历数组并将每个元素保存在文件中(客户端)

问题是console.log(fileName)只打印最后一个元素。所以我得到n了最后一个文件名的时间。

有没有办法欺骗window.webkitRequestFileSystem做我需要的事情,或者可能有解决方法。

document.getElementById("reload-files").onclick = function() {
    reloadFiles(localStorage["user_mail"]);
}

function reloadFiles (email) {
  var files = [];
  var xhr    = new XMLHttpRequest();

  var url = "...url...&email="+escape(email);
  xhr.open("GET", url, true);

  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
      resp = JSON.parse(xhr.responseText);

      for (var i = resp.length - 1; i >= 0; i--) {
        fileName = resp[i].name;
        fileData  = resp[i].data;
        files.push(fileName);
        // save file
        window.webkitRequestFileSystem(window.PERSISTENT, resp[i].data.length, writeToFileStorage, errorHandler);
      };
      localStorage["files"] = JSON.stringify(files);
    }
  }
  xhr.send();
}

function writeToFileStorage(fs) {
  fs.root.getFile(fileName, {create: true}, function(fileEntry) {

    // Create a FileWriter object for our FileEntry (log.txt).
    fileEntry.createWriter(function(fileWriter) {

      fileWriter.onwriteend = function(e) {
        console.log(fileName);
      };

      var blob = new Blob([fileData], {type: 'application/javascript'});

      fileWriter.write(blob);

    }, errorHandler);

  }, errorHandler);
}
4

1 回答 1

0

你的问题是它webkitRequestFileSystem没有立即调用它的回调函数。相反,它会在当前代码完成执行后稍后触发。因此,您会生成一个积压的writeToFileStorage执行,所有这些都读取最终值,在循环完成fileName后留下。for

您可以通过使用来解决这个问题bind,这将生成带有固定参数的回调函数的新副本:

window.webkitRequestFileSystem(window.PERSISTENT,
                               resp[i].data.length,
                               writeToFileStorage.bind(window, fileName, fileData),
                               errorHandler);

然后将这些形式参数添加到您的回调定义中,并制作fs最后一个参数:

function writeToFileStorage(fileName, fileData, fs) {
    ...
}

也就是说,我质疑重复请求文件系统访问的效率。您可以将所有data.length金额相加,然后一次调用webkitRequestFileSystem. 您可以for在回调中增加循环并仅调用一次回调。

于 2013-10-23T13:58:43.707 回答