2012-11-05 47 views
1

我尝试使用HTML5文件系统, 这样我就可以存储在客户端的数据,HTML5文件系统初始化

我的第一次试验是成功的,因为我在一开始使用JavaScript, 启动一切简单的项目,在onclick或onkeypress事件中操作文件(读取文件并将其附加到textarea或P;并编写/修改文件),但是,当我在事件外部同时执行操作时,文件系统为空/未定义,我无法继续该过程,

这里是工作正常的代码:

function initFS() { 
     window.webkitStorageInfo.requestQuota(PERSISTENT,5*1024*1024, 
     function(grantedBytes) { 
      window.requestFileSystem(window.TEMPORARY, grantedBytes, function (filesystem) 
      { 
       fs = filesystem; 
      }, errorHandler); 
     }); 
} 
document.body.onclick=function() 
{ 
    alert(fs); 
    fs.root.getFile('log.txt', {create: true, exclusive: true}, function(fileEntry) { 
    }, errorHandler); 
} 

警报(FS)导致DOM文件系统,这意味着,FS变量是文件系统。

但是,当我这样做:

function initFS() 
{ 
     window.webkitStorageInfo.requestQuota(PERSISTENT,5*1024*1024,function(grantedBytes){ 
    window.requestFileSystem(window.TEMPORARY, grantedBytes, function(filesystem) { 
     fs = filesystem; 
     }, errorHandler); 
    }) 

} 


if (window.requestFileSystem) { 
    initFS(); 
} 
alert(fs); 

警报(FS)返回null, 有没有可以做这个的任何解决方案?任何的解释是有用的这一点, 我不得已将添加一个按钮,使后点击FS肯定会是一个文件系统,但我会尽量避免这种方法

回答

1

这可能是因为requestQuotarequestFileSystem函数是异步。换句话说,在 fs被设置之前,正在执行alert()

那么..你可以把所有的代码放在requestFileSystem的回调中?我对不清楚你正在努力实现

例如,你可以这样做:

function initFS(callback) 
{ 
    window.webkitStorageInfo.requestQuota(PERSISTENT,5*1024*1024,function(grantedBytes){ 
     window.requestFileSystem(window.TEMPORARY, grantedBytes, function(filesystem) { 
      callback(filesystem) 
     }, errorHandler); 
    }) 

} 


if (window.requestFileSystem) { 
    initFS(function (fs) { 
     alert(fs) 
    }); 
} 
+0

这是有意义的,为什么fs是空,是有办法同步做到这一点?因为把我所有的代码放在回调里面并不是我想要做的事 –

+0

我不知道它的同步功能。你可以看看'promises' - 你必须得到一个外部库。或者你可以做一些丑陋的事情,比如'If fs == null然后再次尝试10ms'(伪代码) – paulslater19

+0

或者甚至在你知道它被执行之前就不启动你的代码(例如等待1s) – paulslater19