我如何使用OS.File.open?

时间:2013-10-30 04:18:29

标签: javascript firefox-addon firefox-addon-sdk

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中我会做yielded_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 个答案:

答案 0 :(得分:3)

异步OS.File API返回Promise个。最好与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中的flush()仅在Firefox 27中可用,则不要TextEncoder

修改: 啊,你正在使用SDK,我在重新阅读你的问题的实际错误时收集。

  • 您需要从其他模块明确导入append:,因为SDK模块缺少类。
  • write: true仅在Firefox 27 +
  • 中受支持
  • main.js要写入文件。

这是我在Firefox 25(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");

中测试的一个完整的工作示例
{{1}}

另请参阅your other question以获取有关在SDK中使用此内容的更多评论。