2012-05-21 2 views
0

Я читал примеры приложений, пытающихся научиться узлу. И я заметил, что некоторые используют метод readdirSync при загрузке моделей и контроллеров при загрузке().Узел app.js - Чтение файлов синхронно?

Например:

var models_path = __dirname + '/app/models' 
var model_files = fs.readdirSync(models_path) 
model_files.forEach(function(file){ 
    if (file == 'user.js') 
    User = require(models_path+'/'+file) 
    else 
    require(models_path+'/'+file) 
}) 

Это кажется анти-узел для меня. Это противоположность «try-to-make-all-async», который поддерживает этот узел.

Когда и почему синхронный файл читается, как это, хорошая идея?

+1

Нет такой вещи, как «try-to-make-everything» -async ". Вы всегда используете инструменты, которые вам удобны в данный момент. – freakish

ответ

3

Более чем вероятно, чтобы сделать инициализацию более простой - когда асинхронность для скорости не имеет значения; мы не пытаемся обслуживать многие параллельные запросы.

Аналогичным образом, если вам нужен доступ к какой-либо переменной, которую вы инициализируете при запуске, которая будет использоваться для срока службы приложения, вы не захотите обернуть все ваше приложение в обратном вызове!

0

Синхронное считывание необходимо, когда вы должны быть уверены, что все данные доступны до продолжения. И вам необходимо сохранить последовательность в порядке. Другими словами, если вам НЕОБХОДИМО заблокировать процесс и не удается сделать что-либо еще (для кого-либо), например, при запуске сервера (например, чтение файлов сертификатов для HTTPS).

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

И, конечно, код, который вы приводите в качестве примера, довольно опасен - что происходит, если чтение не выполняется?

Вот 3 из библиотек:

  • Streamline.js Позволяет писать асинхронной JS/CoffeeScript, как если бы это были синхронизации. Просто замените обратные вызовы на «_». НО вы либо должны скомпилировать свои сценарии, либо запустить их через загрузчик.
  • async - похоже, о лучших продуманы и задокументированы и рекомендуется несколькими людьми, которые создали приложения реального мира.
  • async.js - змеевидных, выставляет фс, а также (включает в себя READDIR, walkfiles, Glob, abspath, копировать, гт - ориентированный на фс, а не общий

Эта ссылка может также использоваться: The Tale of Harry - Объяснение как мифический программист переходит от традиционного программирования к основанному на обратном вызове & шаблонам, которые он использует, а также полезному пониманию шаблонов, представленных в асинхронной библиотеке.