Функция Module.exports выполняется до журнала консоли - почему?

Я прочитал несколько ответов на подобные вопросы, но не смог понять, почему мое приложение ведет себя таким образом.

Я обновляю приложение CLI, чтобы оно было модульным. Основной скрипт импортирует функцию с именем questionOne после console.log:

const questionOne = require('./modules/questionOne');

console.log('\n');
console.log('Which DB do you want to use?'.inverse);

questionOne();

questionOne использует readline-sync, чтобы задать вопрос и выполнить код в зависимости от ответа. Но когда я запускаю свое приложение... сначала задается вопрос, а затем Which DB do you want to use запускается после того, как пользователь задал вопрос. Почему?

Для справки

Код для questionOne:

const colors = require('colors');
const readlineSync = require('readline-sync');

//Data Modules
const { dbList } = require('../data/dbList.json');

const db = readlineSync.keyInSelect(dbList);

//people = 0 || offers = 1 || networks = 2

const questionOne = () => {
    if (db === 0) {
        console.log('\n');
        console.log('Which Collection would you like to use?'.inverse.bold);
        // const colRef = readlineSync.keyInSelect();
        // dbPeople(colRef);
    } else if (db === 1) {
        console.log('You picked offers');
    } else if (db === 2) {
        console.log('You picked networks');
    } else {
        process.exit();
    }
};

module.exports = questionOne;

Я понимаю, что я могу поместить console.log внутрь модуля. Но мне любопытно, почему javascript ведет себя так?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы впервые нажимаете require('./modules/questionOne');, весь код запускается на верхнем уровне модуля, который вы загружаете. И он запускает этот код синхронно, то есть он не возвращается до тех пор, пока не вернется этот код верхнего уровня.

Итак, в вашем примере весь код будет выполняться на верхнем уровне вашего модуля questionOne. Этот код верхнего уровня включает в себя эту строку:

const db = readlineSync.keyInSelect(dbList);

Таким образом, эта строка кода будет выполняться до того, как модуль закончит загрузку и до того, как он вернется из этого:

const questionOne = require('./modules/questionOne');

Итак, это должно объяснить, почему первое, что происходит, это то, что вы получаете подсказку от const db = readlineSync.keyInSelect(dbList);. Если вы хотите отобразить что-то перед этим, поместите это перед этим в коде.

Затем, после того, как это обещание выполнено, в вашем модуле questionOne происходит только одно: определение функции questionOne и присваивание module.exports = questionOne;. В этот момент require('./modules/questionOne'); возвращается, и значение из module.exports присваивается вашей переменной questionOne в вашем основном модуле.

Затем, и только тогда, остальная часть вашего основного модуля запускается и выполняется:

console.log('\n');
console.log('Which DB do you want to use?'.inverse);

questionOne();

I understand that I can put the console.log inside the module. But I am curious why javascript behaves this way?

Это просто выполнение кода в том порядке, в котором он встречается. Ничто здесь не кажется асинхронным, поэтому просто запускайте одну строку кода за другой по мере их обнаружения.

Удивительно, это действительно имеет смысл. Итак... 2 уточняющих вопроса. 1. как мне создать модуль таким образом, чтобы я мог выполнять функцию, когда захочу? есть ли другой способ экспортировать его? Во-вторых, когда я делаю questionOne() в основном файле, он ничего не делает - почему?

Vinn 09.04.2022 11:31

@Vinn - не вызывайте const db = readlineSync.keyInSelect(dbList); при инициализации вашего модуля. Либо экспортируйте отдельную функцию для ее запуска, либо выполните ее внутри questionOne().

jfriend00 10.04.2022 00:14

Другие вопросы по теме