3
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 文档太详尽了,我不知道从哪里开始。

4

1 回答 1

3

异步 OS.File API 返回Promises。最好与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(); 
    });
}

文档有一些示例。

另外,flush()如果您不需要,请不要这样做(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");

有关在 SDK 中使用这些内容的更多评论,另请参阅您的其他问题。

于 2013-10-30T04:34:01.113 回答