2016-10-14 5 views
-1

私のスコープには何か問題があります。私は、次のサンプルコードがあります、Node JS Scoping

/** 
* 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; 

私は期待を.thenに、pは返すべきであることを約束して、成功したreadSettingsFile後、そのpublic.versionは今含めるべきであるが、それは次のように返しています:

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

にconsole.logスイッチでステートメントが正常に戻っている:

0.1 
+1

あなたは 'public.readSettingsFile'関数を呼び出していません。そうするとき、あなたのreadlineコードが非同期であることが分かります。 – zerkms

+1

あなたがやっていることの多くは、明確で完全ではありません。たとえば、実際にどこでreadSettingsFileを呼び出しますか?あなたの約束はまた成功の結果を返しません。 –

+0

申し訳ありませんが、より多くの感覚を与えようと編集しました –

答えて

2

私はあなたの問題は、「スコープ」ではないと思うが、あなたはどのように理解していません約束を使う。 Mozilla documentationDavid Walsh's blog postの両方をお勧めします。もっと複雑なものを試す前に、小さなものから始めることをお勧めします。

ここでは具体的な質問にお答えします。あなたが見たいと思っていない理由は、すべてのラインストリームビジネスが非同期であることです。あなたはswitch文に入る前に、関数の最後に約束を返します。基本的には、約束事を全体の機能として考える。しかし、値を返すのではなく、値またはエラーの約束を返します。関数の途中で約束を破っている場合、関数はあまりにも多くのことをしようとしており、コードをさらに分離する必要があります。

これは、あなたが望むものに近いはずです。これは完璧なコードではなく、あなたのニーズに合わないかもしれませんが、うまくいけば正しい軌道に乗ります。がんばろう。

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は非同期で実行されており、解決が終了していないため、実際に正しく終了せずに '解決'パスが実行されます。