fileWriter究竟在javascript中运行的是什么

时间:2013-10-25 10:12:26

标签: javascript html5 filewriter

我在项目中使用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',它完全可以工作和写入。

任何人都知道为什么?我如何实现我想要的?如果你能帮助我,请先欣赏。

1 个答案:

答案 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)
  • ...

发生的其他事情是实现细节和错误。 总而言之:在进行另一次写操作之前,总是等待写操作完成。

当前规范草案实际disallowsseek/write时调用readyState === WRITING,并声明readyState应设置为WRITING as soon as the write function gets called。 Chrome尚未实现此版本的规范,或者仍然存在错误,或者如果在第二次调用InvalidStateError(无超时版本)时抓住了您的竞争并抛出.seek()