nodejs пишет синхронные функции, например, fs.readFileSync - PullRequest
0 голосов
/ 19 января 2019

Я хочу создать функции, которые извлекают данные из базы данных, например executeQuery(sql).Но я не хочу никаких обещаний, возвращаемых из этой функции, или хочу передать любую функцию обратного вызова.Я просто хочу вернуть результат запроса.

Например:

var rows = executeQuery('SELECT * FROM table');
console.log('database query completed:', rows);

Я знаю, что это не так, как работает JavaScript.Я также прошел через множество вопросов о стековом потоке, которые тоже хотели этого.Но все говорят, что это невозможно сделать.

Теперь вот мой вопрос , если это невозможно, то как работают такие функции, как fs.readFileSync().Эти функции не требуют никаких обратных вызовов и не возвращают никаких обещаний.Они просто делают то, что им определено делать.

Ответы [ 4 ]

0 голосов
/ 20 января 2019

fs.readFileSync () может быть синхронным, потому что он просто работает с вашей локальной файловой системой, что может быть быстрой операцией. Если ваша база данных является локальной, ее также можно записать как синхронную. Однако, если ваша база данных находится в сети, executeQuery должен будет отправить запрос http и дождаться ответа, который может занять много времени и может быть невозможен синхронно из-за следующего:

Примечание. Начиная с Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), синхронные запросы в главном потоке устарели из-за негативного влияния на работу пользователя.

0 голосов
/ 19 января 2019

Синхронизация является синхронной и блокирует выполнение до завершения.Методы Sync для fs возвращают свои результаты как возвращаемые значения.

Другие несинхронизированные методы для fs являются асинхронными и возвращаются немедленно, пока они работают в фоновом режиме.Вы передаете функцию обратного вызова, которая вызывается, когда они заканчивают.

Обещания - это немного кошмар, когда вы начинаете использовать Javascript, но, поскольку у Javascript есть только один поток, они становятся частью красоты Javascript, как только вы используетеим.Если вы используете функции синхронизации, вы блокируете поток, что, как правило, не очень хорошая идея, особенно если вы не используете рабочих.

Я написал пост о переносе обещаний, если вы хотите проверить его.здесь

Почему Async всегда возвращает обещание?

0 голосов
/ 20 января 2019

Обновление: Как сказал @Paulpro в комментариях, этот ответ ниже никогда не сработает, потому что код застрянет в бесконечном цикле. так что вам лучше пойти с обещаниями


Я советую как @ happy-machine & @bergur, лучше использовать Promises. но если вы хотите знать, как работает fs.readFileSync(), прочитайте код модуля fs в исходном коде nodejs .

Вы обнаружите, что он делает do {} while(), и вы можете сделать то же самое синхронизировать ваш асинхронный код следующим образом

var rows;
executeQuery('SELECT * FROM table').then(
  promiseResponse => {
   rows = promiseResponse
  }
)
do {
  // nothing
} while(!rows) // rows is undefined
console.log('database query completed:', rows);
0 голосов
/ 19 января 2019

Вы можете использовать async / wait. Это дало бы вам почти такой же синтаксис, что и readFileSync - это не цепочки обещаний или обратные вызовы.

var rows = await executeQuery('SELECT * FROM table')
console.log('database query completed:', rows) // this now works

Вам просто нужно обернуть его внутри асинхронной функции.

Просто чтобы избежать путаницы. Функция все еще асинхронна, ее синтаксический сахар упрощает чтение кода.

...