【问题标题】:Node JS Scoping节点 JS 范围
【发布时间】:2016-10-14 02:41:18
【问题描述】:

我的范围界定有问题,我在这里不太了解。我有以下示例代码:

/**
 * 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] }

switch语句中的console.log正确返回:

0.1

【问题讨论】:

  • 您甚至还没有调用public.readSettingsFile 函数。当你愿意时 - 你会发现你的 readline 代码是异步的。
  • 你所做的很多事情都不是很清楚和完整。例如,您实际上在哪里调用 readSettingsFile?您的承诺也不会返回成功的结果。
  • 抱歉,编辑是为了让它更有意义
  • @zerkms,我想知道我设置 Promise 的方式,它是否仍在异步运行,所以尽管尚未完成阅读,但它正在返回一个有效的 Promise?
  • new Promise(function(resolve,reject){ reject(err); }); 只是Promise.reject(err)

标签: javascript node.js scope


【解决方案1】:

我认为您的问题不在于“范围界定”,但您不了解如何使用承诺。我强烈推荐Mozilla documentationDavid Walsh's blog post。我还建议你从小处着手,先写一些简单的 Promise,然后再尝试更复杂的东西。

现在我将回答您的具体问题。您没有看到您想看到的内容的原因是您所有的 linestream 业务都是异步的。在你进入你的 switch 语句之前,你在你的函数结束时返回承诺。基本上,将 Promise 视为一个整体功能。但不是返回一个值,而是返回一个值或错误的承诺。如果你在函数中间抛出一个 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");
            }
        });
    }
} 

【讨论】:

    【解决方案2】:

    我的代码实际上大部分是正确的,但正如 Paul 在他的回答中提到的那样,解析的位置错误。 lineStream.on 正在异步运行,并且解析位于完成之外,因此它会运行“解析”路径而实际上并未正确完成。

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多