Javascript google chrome扩展在客户端保存文件

Javascript google chrome扩展在客户端保存文件,javascript,google-chrome-extension,webkit,Javascript,Google Chrome Extension,Webkit,所以基本上是这样的: 1) 按钮点击 2) 返回json arrya的外部请求 3) 循环遍历数组并将每个元素保存在文件中(客户端) 问题是console.log(文件名)只打印最后一个元素。所以我得到了最后一个文件名的n倍。 有没有办法欺骗window.webkitRequestFileSystem来做我需要做的事情,或者有一个解决方法 document.getElementById("reload-files").onclick = function() { reloadFiles

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

问题是
console.log(文件名)
只打印最后一个元素。所以我得到了最后一个文件名的
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);
}

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

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

window.webkitRequestFileSystem(window.PERSISTENT,
                               resp[i].data.length,
                               writeToFileStorage.bind(window, fileName, fileData),
                               errorHandler);
然后将这些形式参数预先添加到回调定义中,并将
fs
作为最终参数:

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

也就是说,我质疑重复请求文件系统访问的效率。您可以对所有
data.length
金额进行求和,并对
webkitRequestFileSystem
进行一次调用。您可以在回调中执行更多的
for
循环,并准确调用回调一次。

您试图在文件系统中存储哪些无法存储在
localStorage
/中的内容。我可以使用localStorage,但数据可能超过5 mb,因此,我必须创建文件。无论如何,这是不正确的。感谢
绑定。关于效率,数据必须在不同的文件中,或者我在这里出错了?如果我将它们合并在一起并只调用一次
webkitRequestFileSystem
,那会只创建一个文件吗?我如何在
文件1
中获取数据。我的设想是,所有文件都将合并为一个字符串,然后写入文件。@waaadim
webkitRequestFileSystem
请求文件系统空间
fs.root.getFile
实际上创建文件来填充该空间。您需要一点空间,然后填充它,然后再请求一点空间,然后填充它,等等。我只是建议您一次请求所有空间,然后在回调中填充所有文件(重复调用
fs.root.getFile
)。关于
bind
fs
在函数
writeToFileStorage
中未定义。看起来
bind
把事情搞砸了。@waaadim哦,对不起,我错过了
bind
的第一个参数,它设置了函数的
这个值。编辑。