我正在唠叨firefox扩展程序。 我得到了阅读文件内容的功能:
var HelloWorld = {...
getData: function () {
var env = Components.classes["@mozilla.org/processenvironment;1"].getService(Components.interfaces.nsIEnvironment);
var path = env.get("TEMP");
path = path + "\\lastcall.txt"
alert(path);
Components.utils.import("resource://gre/modules/osfile.jsm");
let decoder = new TextDecoder();
let promise = OS.File.read(path);
var line = null;
promise = promise.then(
function onSuccess(array) {
line = decoder.decode(array)
alert(line);
return line;
}
);
alert("ducky:"+line+"duck");
},
...};
我除了line
将是相同的,因为在函数外声明。从内部警报我得到了适当的价值,但是从外面我得到了duckynullduck
。如何解决它
答案 0 :(得分:5)
如何解决它
不要使用外部警报。
即how asynchronous code works,您只能访问稍后执行的回调中的数据。但是,通过promise链接,它不需要全部使用相同的回调或嵌套回调。
let decoder = new TextDecoder();
let promise = OS.File.read(path);
return promise.then(function onSuccess(array) {
var line = decoder.decode(array);
alert(line);
return line;
}).then(function onSuccess2(line) {
alert("ducky:"+line+"duck");
return line;
}); // return the promise for the line!
答案 1 :(得分:1)
getData: function () {
var env = Components.classes["@mozilla.org/processenvironment;1"].getService(Components.interfaces.nsIEnvironment);
var path = env.get("TEMP");
path = path + "\\lastcall.txt"
alert(path);
Components.utils.import("resource://gre/modules/osfile.jsm");
return OS.File.read(path).then(function(array) {
let decoder = new TextDecoder();
return decoder.decode(array);
});
},
...};
而不是返回line
您返回对行的承诺,然后调用者可以执行:
var line = getData();
// When you finally need the actual line, unwrap it:
line.then(function(actualLine) {
});