代码之家  ›  专栏  ›  技术社区  ›  user621819

如何使用OS.File.open?

  •  3
  • user621819  · 技术社区  · 11 年前
    function write_text(filename, text) {
        let pfh = yield OS.File.open("/tmp/foo", {append: true});
        yield pfh.write(text);
        yield pfh.flush();
        yield pfh.close(); 
    }
    

    我试过没有 产量 这是一种更自然的形式,但它被打破了: 在python中,我会做yield_object.next()

    error: scribus-web-slurp: An exception occurred.
    TypeError: pfh.write is not a function
    resource://jid1-orxy9dnn8jbfeq-at-jetpack/scribus-web-slurp/lib/main.js 28
    Traceback (most recent call last):
    

    我知道Javascript,但正是Firefox扩展造成了问题——有什么教程可以引导我完成整个过程或让我达到标准吗??MDN文档过于详尽,我没有;我不知道从哪里开始。

    1 回复  |  直到 11 年前
        1
  •  3
  •   Community CDub    7 年前

    异步OS.File API返回 Promise s。它最好与 Task.jsm

    function write_text(filename, text) {
        var encoder = new TextEncoder();
        var data = encoder.encode(text);
        Task.spawn(function() {
            let pfh = yield OS.File.open("/tmp/foo", {write: true});
            yield pfh.write(data);
            yield pfh.close(); 
        });
    }
    

    这个 documentation 有一些例子。

    此外,不要 flush() 如果你不必 冲洗() 在异步API中,只能在Firefox 27中使用)

    编辑 : 啊,你在使用SDK,我在重读你问题的实际错误时收集到了这一点。

    • 您需要导入 TextEncoder 显式地从其他一些模块中删除,因为SDK模块缺少该类。
    • append: 仅在Firefox 27中受支持+
    • write: true 写入文件。

    这是我在Firefox 25中测试的一个完整的工作示例( main.js )

    const {Cu} = require("chrome");
    const {TextEncoder, OS} = Cu.import("resource://gre/modules/osfile.jsm", {});
    const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
    
    function write_text(filename, text) {
        var encoder = new TextEncoder();
        var data = encoder.encode(text);
        filename = OS.Path.join(OS.Constants.Path.tmpDir, filename);
        Task.spawn(function() {
           let file = yield OS.File.open(filename, {write: true});
           yield file.write(data);
           yield file.close(); 
           console.log("written to", filename);
        }).then(null, function(e) console.error(e));
    }
    
    write_text("foo", "some text");
    

    另请参阅 your other question 有关在SDK中使用这些东西的更多评论。