节点JS范围

时间:2016-10-14 02:41:19

标签: javascript node.js scope

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

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

2 个答案:

答案 0 :(得分:2)

我认为您的问题不在于“范围界定”,但您不了解如何使用承诺。我强烈推荐Mozilla documentationDavid Walsh's blog post。我还建议你在尝试更复杂的事情之前从小做起并写一些简单的承诺。

现在我将回答您的具体问题。您没有看到您想要看到的内容的原因是您的所有线流业务都是异步的。在转到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");
            }
        });
    }
} 

答案 1 :(得分:0)

我所拥有的代码实际上大部分都是正确的,但正如保罗在答案中提到的那样,决心是在错误的位置。 lineStream.on正在运行async并且解析位于它之外,因此它将运行'resolve'路径而不会实际正确完成。