Я прочитал несколько ответов на подобные вопросы, но не смог понять, почему мое приложение ведет себя таким образом.
Я обновляю приложение CLI, чтобы оно было модульным. Основной скрипт импортирует функцию с именем questionOne после console.info:
const questionOne = require('./modules/questionOne');
console.info('\n');
console.info('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.info('\n');
console.info('Which Collection would you like to use?'.inverse.bold);
// const colRef = readlineSync.keyInSelect();
// dbPeople(colRef);
} else if (db === 1) {
console.info('You picked offers');
} else if (db === 2) {
console.info('You picked networks');
} else {
process.exit();
}
};
module.exports = questionOne;
Я понимаю, что я могу поместить console.info внутрь модуля. Но мне любопытно, почему javascript ведет себя так?
Когда вы впервые нажимаете 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.info('\n');
console.info('Which DB do you want to use?'.inverse);
questionOne();
I understand that I can put the console.info inside the module. But I am curious why javascript behaves this way?
Это просто выполнение кода в том порядке, в котором он встречается. Ничто здесь не кажется асинхронным, поэтому просто запускайте одну строку кода за другой по мере их обнаружения.
@Vinn - не вызывайте const db = readlineSync.keyInSelect(dbList);
при инициализации вашего модуля. Либо экспортируйте отдельную функцию для ее запуска, либо выполните ее внутри questionOne()
.
Удивительно, это действительно имеет смысл. Итак... 2 уточняющих вопроса. 1. как мне создать модуль таким образом, чтобы я мог выполнять функцию, когда захочу? есть ли другой способ экспортировать его? Во-вторых, когда я делаю questionOne() в основном файле, он ничего не делает - почему?