编程语言
首页 > 编程语言> > javascript-如何使用OS.File.open?

javascript-如何使用OS.File.open?

作者:互联网

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(); 
}

我尝试不使用更自然的形式yield,但是失败了:
在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文档太详尽了,我不知道从哪里开始.

解决方法:

异步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(); 
    });
}

documentation有一些示例.

另外,如果不需要,也不要刷新(并且异步API中的flush()仅在Firefox 27中可用).

编辑:
嗯,您使用的是SDK,在重新阅读您的问题的实际错误时,我会进行收集.

>由于SDK模块缺少该类,因此您需要从其他模块中显式导入TextEncoder.
>附加:仅Firefox 27支持
>您写入:写入文件为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中使用此内容的更多评论.

标签:firefox-addon,firefox-addon-sdk,javascript
来源: https://codeday.me/bug/20191122/2060808.html