2016-10-14 136 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正在运行异步,并且该解析位于其完成之外,所以它将运行“解析”路径而不实际正确完成。