nodejs пишет синхронные функции, например, fs.readFileSync

Вот как вы можете запускать свою логику в разных каталогах:

>>> import os
>>> path = './python'
>>> for name in os.listdir(path) :
...     newpath = path+'/'+name
...     if os.path.isdir(newpath) :
...             for filename in os.listdir(newpath) :
...                     # do the work
...                     filepath = newpath + '/' + filename
...                     print(filepath)
...
2
задан Amarjit Singh 19 January 2019 в 20:42
поделиться

4 ответа

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

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

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

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

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

0
ответ дан Happy Machine 19 January 2019 в 20:42
поделиться

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

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

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

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

0
ответ дан Bergur 19 January 2019 в 20:42
поделиться

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


Я советую, как @ happy-machine & amp; @bergur, лучше использовать обещания. но если вы хотите знать, как работает 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
ответ дан Oudmane 19 January 2019 в 20:42
поделиться

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

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

0
ответ дан Steve 19 January 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: