2013-07-30 1 views
1

Я не знаю, как узел реализует свою удивительную идею. И у меня вопрос, когда его использовать.
я должен прочитать четыре файла file1.js file2.js file3.js file4.js и Concat их в один большой файл яваскрипта result.js. Важно соблюдать порядок.Как node.js реализует async-callback с одним процессом

Так что это нормально для меня, чтобы использовать readFileSync вместо ReadFile.
Я знаю, что это плохое решение. У кого-то есть хорошая идея?

Q: Возможно ли node.js читать четыре файла в то же время?

Надеюсь, что кто-то может объяснить принцип node.js, и когда process.nextTick будет запущен.

ответ

4

A: да, возможно, что узел может одновременно читать 4 файла.

Мой ответ будет, это зависит от вашей ситуации, для чтения файлов синхронно или асинхронно. Если это данные конфигурации или файлы могут быть кэшированы, я бы предложил просто сделать это синхронно, это просто, и это делается только один раз. Поэтому вы не будете долго ждать. Длительные операции при инициализации являются типичными и могут сделать вещи в долгосрочной перспективе более эффективными. При этом, читая четыре файла по порядку, асинхронно, чтобы ваша программа могла делать другие вещи в фоновом режиме, это не так сложно. Я буду работать над синхронизацией и асинхронными примерами каждого и добавить редактирование.

/* jshint node:true*/ 

var fs = require('fs'); 

function readFilesSync(fileNames) { 
    'use strict'; 
    var results = ''; 

    for (var i = 0; i < fileNames.length; i++) { 
     results += fs.readFileSync(fileNames[i]); 
    } 

    return results; 
} 

function readFiles(fileNames, callback) { 
    'use strict'; 
    var results = ''; 

    function readFile(index) { 
     if (index < fileNames.length) { 
      fs.readFile(fileNames[index], function (err, data) { 
       results += data; 
       readFile(index + 1); 
      }); 
     } else { 
      callback(results); 
     } 
    } 

    readFile(0); 
} 

function readAllFilesAtOnce(fileNames, callback) { 
    'use strict'; 
    var results = {}; 
    var numFiles = fileNames.length; 

    function callBackWrapper() { 
     var resultsOrdered = ''; 

     for (var i = 0; i < fileNames.length; i++) { 
      resultsOrdered += results[fileNames[i]]; 
     } 
     callback(resultsOrdered); 
    } 

    function readFileAsync(fileName) { 
     fs.readFile(fileName, function (err, data) { 
      results[fileName] = data; 
      numFiles--; 

      if (numFiles === 0) { 
       callBackWrapper(); 
      } 
     }); 
    } 

    for (var i = 0; i < fileNames.length; i++) { 
     readFileAsync(fileNames[i]); 
    } 

} 

function doSomethingWithTheData(data) { 
    'use strict'; 
    console.log('Results async: ' + data); 
} 

function doSomethingWithTheData2(data) { 
    'use strict'; 
    console.log('Results async all at once: ' + data); 
} 

var fileNamesArray = ['blah.js', 'file.js', 'hello.txt']; 

console.log('The results sync: ' + readFilesSync(fileNamesArray)); 

readFiles(fileNamesArray, doSomethingWithTheData); 

readAllFilesAtOnce(fileNamesArray, doSomethingWithTheData2); 

EDIT: Там я добавил метод для чтения всех файлов одновременно.

Process.nextTick выполняет не более, чем обработку этой функции в следующий раз вокруг цикла событий. EX:

process.nextTick(function() { 
    console.log('never printed out'); 
}); 

while(true); 

экс 2:

process.nextTick(function() { 
     console.log('printed last'); 
}); 

console.log('printed first'); 
+0

Я согласен, последовательная схема является лучшим способом сделать это. – francoisr

+0

Спасибо, проклятье. узел может читать файлы одновременно. Но я все еще не знаю, почему. Я когда-либо думал, что узел может читать файл и обрабатывать сетевой запрос одновременно, но не читать два файла. Есть ли какая-то информация о том, как это сделал узел? –

+0

Узел, с точки зрения сценариев, не имеет резьбы. Однако узел работает на V8-сервере. Как сервер V8 поддерживает параллелизм - это детали реализации, о которых нам не нужно беспокоиться. Но это может включать в себя процессы нереста, запуск потоков, внешние системные команды и т. Д. Пока он придерживается спецификации javascript. – ChrisCM

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