2016-04-17 4 views
1

Позволяет себе представить асинхронную функцию, которая сначала загружает файл, а затем выполняет асинхронно с ним. Функция не может продолжаться без файла, так что мое предположение, что загрузка этого файла может быть сделано синхронно (*):Влияние функции синхронизации внутри асинхронных функций

const asyncFnWithSyncCode(filePath, next) { 

    // Load file 
    const file = fs.readFileSync(filePath) 

    // Continue to process file with async functions 
    // ... 

    next(null, processedFile) 

} 

asyncFnWithSyncCode можно было бы назвать несколько раз для различных файлов:

async.parallel([ 
    (done) => { asyncFnWithSyncCode('a.json', done) }, 
    (done) => { asyncFnWithSyncCode('b.json', done) }, 
    (done) => { asyncFnWithSyncCode('c.json', done) } 
], next) 

Мой вопрос: как это влияет на производительность? Будет ли синхронизирующая функция задерживать другие readFileSync? Будет ли это иметь влияние вообще?

Наилучшие практики, ресурсы и мнения приветствуются. Благодаря!

(*) Я знаю, что могу просто использовать async readFile -version, но мне очень хотелось бы знать, как это работает в этой специальной конструкции.

ответ

1

Будет ли синхронизирована функция задержки readFileSyncs?

Да. NodeJS запускает весь ваш JavaScript-код в потоке single, используя цикл событий (очередь заданий), что является одной из причин, по которым использование синхронных асинхронных системных вызовов настоятельно рекомендуется.

readFile планирует операцию чтения, а затем пропускает другие вещи в потоке JavaScript, пока уровень ввода-вывода ожидает ввода данных; Уровень ввода-вывода Node ставит задачу для потока JavaScript, когда доступны данные, что в конечном итоге вызывает вызов callback .

В отличие от этого, readFileSync поддерживает один поток JavaScript, ожидая, когда данные файла станут доступны. Поскольку есть только один поток, который удерживает все остальное, ваш код мог бы быть в противном случае, включая другие readFileSync звонки.

Ваш код не должен использовать readFileSync (вы почти никогда не делаете); просто используйте ответный вызов readFile:

const asyncFnWithSyncCode(filePath, next) { 

    // Load file 
    fs.readFile(filePath, function(err, file) { 
     if (err) { 
      // ...handle error... 
      // ...continue if appropriate: 
      next(err, null); 
     } else { 
      // ...use `file`... 

      // Continue to process file with async functions 
      // ... 
      next(null, processedFile); 
     } 
    }); 
} 
+0

Очень хорошо объяснено. Большое спасибо! – tobi

Смежные вопросы