2014-06-11 35 views
1

我是whiting firefox擴展。 我得到的功能是閱讀文件的內容:JavaScript如何獲取Promise onSuccess中承諾的變量值Promise

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

'OS.File.read'做一些事情異步。只有在promise被解析並且你傳遞給'then'的函數被執行之前'line'纔會有值。將依賴'line'的代碼移到回調中。 –

回答

5

如何解決它

不要使用外警戒。

這就是how asynchronous code works,您只能訪問稍後執行的回調中的數據。但是,在承諾鏈接的情況下,它不需要全部使用同一個回調函數或嵌套的回調函數。

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

});