2016-10-14 190 views
-1

我的範圍有些問題,我在這裏不太理解。我有以下示例代碼:節點JS範圍

/** 
* Created by David on 10/9/2016. 
*/ 
var public = {}; 

//REQUIRES 
var fs = require('fs'); 
var rl = require('readline'); 

//======================================== 
var configFile = './config'; 
public.configFile = configFile; 

//======================================== 
public.readSettingsFile = function(conFile){ 
    return new Promise(function(resolve,reject){ 
     try { 
      console.log("Importing Settings"); 
      //read configuration file line by line 
      var lineStream = rl.createInterface({ 
       input: fs.createReadStream(conFile === undefined ? configFile : conFile) 
      }); 
      lineStream.on('line', function (line) { 
       if(!line.startsWith('#')){ 
        var splitLine = line.split('='); 
        switch(splitLine[0]){ 
         case 'version': 
          public.version = splitLine[1]; 
         break; 
         case 'basePath': 
          public.basePath = splitLine[1]; 
         break; 
        } 

       } 
       resolve(public); 
      }); 

     }catch(err){ 
      reject(err); 
     } 
    }); 
} 

//======================================== 

module.exports = public; 

我所期望的,與上。然後,對應該返回的承諾,成功readSettingsFile後,即public.version現在應該包括在內,但它返回以下:

{ configFile: './config', readSettingsFile: [Function] } 

在switch語句中的console.log正確返回:

0.1 
+1

你甚至沒有調用'public.readSettingsFile'函數。當你會 - 你會發現你的readline代碼是異步的。 – zerkms

+1

你正在做的很多事情並不清楚和完整。例如,你在哪裏實際調用readSettingsFile?您的承諾也不會在成功時返回結果。 –

+0

對不起,編輯,以嘗試給它更多的意義 –

回答

2

我覺得你的問題是不是與「作用域」,但你不知道如何使用承諾。我強烈推薦Mozilla documentationDavid Walsh's blog post。我也建議你在嘗試一些更復雜的事情之前先從小開始寫一些簡單的承諾。

現在我會回答你的具體問題。你沒有看到你想要看到的原因是你所有的linestream業務都是異步的。您在開始使用switch語句之前,在函數結束時返回promise。基本上,把承諾看作是一個整體功能。但不是返回一個值,而是返回值或錯誤的承諾。如果你在一個函數的中間拋出一個承諾,你的函數會嘗試做太多的事情,並且你需要更多地分離你的代碼。

這應該更接近你想要的。這不是完美的代碼,它可能不適合你的需求,但希望它能讓你走上正軌。祝你好運。

public.readSettingsFile = function(conFile){ 
    return new Promise(function(resolve, reject) { 
     var lineStream = rl.createInterface({ 
      input: fs.createReadStream(conFile === undefined ? configFile : conFile) 
     }); 
     lineStream.on('line', function (line) { 
      if(!line.startsWith('#')){ 
       var splitLine = line.split('='); 
       // You don't need a switch statement for only one case 
       if (splitLine[0] === 'version') { 
         public.version = splitLine[1]; 
         console.log(public.version); 
         // You actually have to resolve something 
         resolve(public); 
       } else { 
       // There's a problem, reject it. 
       reject("Some error message"); 
      } 
     }); 
    } 
} 
0

我的代碼實際上大部分是正確的,但正如保羅在他的回答中提到的那樣,決心是在錯誤的位置。 lineStream.on正在運行異步,並且該解析位於其完成之外,所以它將運行「解析」路徑而不實際正確完成。