Вот как вы можете запускать свою логику в разных каталогах:
>>> 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)
...
Синхронизация является синхронной и блокирует выполнение до завершения. Методы Sync для fs возвращают свои результаты как возвращаемые значения.
Другие несинхронизированные методы fs являются асинхронными и возвращаются немедленно, пока они работают в фоновом режиме. Вы передаете функцию обратного вызова, которая вызывается после завершения.
Обещания становятся кошмаром, когда вы начинаете использовать Javascript, но поскольку у Javascript есть только один поток, они становятся частью красоты Javascript, как только вы к ним привыкнете. Если вы используете функции синхронизации, вы блокируете поток, что, как правило, не очень хорошая идея, особенно если вы не используете рабочие.
Я написал пост о том, как обернуть вас обещаниями, если вы хотите проверить его здесь
Вы можете использовать async / wait. Это дало бы вам почти такой же синтаксис, что и readFileSync - это не цепочки обещаний или обратные вызовы.
var rows = await executeQuery('SELECT * FROM table')
console.log('database query completed:', rows) // this now works
Вам просто нужно обернуть его внутри асинхронной функции.
Просто, чтобы избежать путаницы. Функция все еще асинхронна, ее синтаксический сахар упрощает чтение кода.
Обновление: Как сказал @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);
fs.readFileSync () может быть синхронным, потому что он просто работает с вашей локальной файловой системой, что может быть быстрой операцией. Если ваша база данных является локальной, она также может быть записана как синхронная. Однако, если ваша база данных находится в сети, executeQuery должен будет отправить запрос http и дождаться ответа, который может занять много времени и может быть невозможен синхронно из-за следующего:
Примечание: Начиная с Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), синхронные запросы в основном потоке устарели из-за негативного влияния на работу пользователя.