Узел 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, теперь publicversion должен быть включен, но он возвращает следующее:

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

Команда console.log в операторе switch корректно возвращается:

0.1

javascript,node.js,scope,

-1

Ответов: 2


2 принят

Я думаю, что ваша проблема не в том, что вы просматриваете, но вы не понимаете, как использовать обещания. Я очень рекомендую как документацию Mozilla, так и блог Дэвида Уолша . Я также рекомендую начинать с малого и писать простые обещания, прежде чем пытаться сделать что-то более сложное.

Теперь я отвечу на ваш конкретный вопрос. Причина, по которой вы не видите, что вы хотите увидеть, - это то, что все ваши бизнес-потоки являются асинхронными. Вы возвращаете обещание в конце своей функции, прежде чем перейти к оператору 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 запускал async, и решение находилось за пределами его завершения, поэтому оно запускало бы путь «разрешения», фактически не закончив правильно.

JavaScript, Node.js, область применения,