我在项目中使用HTML5的文件系统功能。并尝试使用for-loop将文本附加到文件连续。但实际上它只会影响一次写入这是最后一次写入,即使我已经 5“写完了。”(这应该意味着它成功写了5次)。这是我的代码:
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
var fs;
function initFS() {
console.log("init filesystem")
window.requestFileSystem(window.TEMPORARY, 1024 * 1024, function (filesystem) {
fs = filesystem;
console.log(fs);
}, errorHandler);
}
function errorHandler(e) {
var msg = '';
switch (e.code) {
...
};
console.log('Error: ' + msg);
}
function receiveFile(cont) {
fs.root.getFile('log.txt', {
create: true
}, function (fileEntry) {
// Create a FileWriter object for our FileEntry (log.txt).
fileEntry.createWriter(function (fileWriter) {
fileWriter.seek(fileWriter.length);
fileWriter.onwriteend = function (e) {
console.log('Write completed.');
};
fileWriter.onerror = function (e) {
console.log('Write failed: ' + e.toString());
};
// Create a new Blob and write it to log.txt.
var bb = new Blob([cont]);
fileWriter.write(bb);
}, errorHandler);
}, errorHandler);
}
function foo() {
for (i = 0; i < 5; i++) {
setTimeout(function () { // // it works, BTW: Why it didn't write the num in ascending order as expected
(function (x) {
receiveFile(x);
})(i)
}, i * 1000);
//receiveFile(i); // didn't work, just write once
}
}
window.addEventListener("load", initFS, false);
您可以在jsfiddle上试用,并从此链接获取结果: filesystem:http://fiddle.jshell.net:0/temporary/
我在考虑是否写得太快以至于无法及时保存。所以我尝试'setTimeout',它完全可以工作和写入。
任何人都知道为什么?我如何实现我想要的?如果你能帮助我,请先欣赏。
答案 0 :(得分:5)
fileWriter.write()
是一个异步操作。你基本上在这里创造了一场比赛
没有超时会发生什么(如果写入很慢,甚至会超时):
receiveFile(0)
fileWriter.seek(fileWriter.length /* == 0 */)
queue write(0)
receiveFile(1)
fileWriter.seek(fileWriter.length /* == 0 */)
- 是的,仍然是0
,因为还没有实际的写作。queue write(1)
actual async write(0)
actual async write(1)
发生的其他事情是实现细节和错误。 总而言之:在进行另一次写操作之前,总是等待写操作完成。
当前规范草案实际disallows在seek/write
时调用readyState === WRITING
,并声明readyState
应设置为WRITING
as soon as the write
function gets called。
Chrome尚未实现此版本的规范,或者仍然存在错误,或者如果在第二次调用InvalidStateError
(无超时版本)时抓住了您的竞争并抛出.seek()
。