JavaScript如何获取Promise onSuccess在promise之外分配的变量值

时间:2014-06-11 14:01:27

标签: javascript firefox-addon scope promise

我正在唠叨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。如何解决它

2 个答案:

答案 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) {

});