2013-10-23 90 views
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); 
} 
+0

你试图存储在你不能存储在'localStorage' /'chrome.storage'文件系统中的文件夹 – megawac

+0

我可以使用localstorage,但数据可能超过5 MB,所以我必须创建文件。 – waaadim

+0

没想到这是不正确的 – megawac

回答

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循环,并且只需调用一次回调。

+0

感谢'绑定'。以及关于效率的问题,数据必须放在不同的文件中,还是在这里出错? 如果我将它们合并在一起并且只调用一次'webkitRequestFileSystem',那么是否只创建一个文件?以及如何获得'file1'中的数据。我想象的是,所有文件将被合并为一个字符串,然后写入文件。 – waaadim

+0

@waaadim'webkitRequestFileSystem'请求文件系统空间。 'fs.root.getFile'实际上会创建文件来填充该空间。你需要一点空间,然后填充它,然后要求多一点空间,然后填充它,等等。我只是建议你一次请求所有空间,然后填写所有文件(反复调用'fs.root.getFile')在你的回调中。 – apsillers

+0

好的,我会改变这一点。关于'bind',函数'writeToFileStorage'中未找到'fs'。它看起来像'绑定'正在搞点东西。 – waaadim