我不知道节点如何实现其惊人的想法。我在使用它时有一个问题 我必须阅读四个文件 file1.js file2.js file3.js file4.js 并将它们连成一个大的javascript文件 result.js 。保持秩序很重要。
因此,使用 readFileSync 代替 readFile 是正常的。
我知道这是一个糟糕的解决方案。有人有个好主意吗?
问: node.js是否可以同时读取四个文件?
希望有人能解释node.js的原理以及何时触发process.nextTick。
答案 0 :(得分:4)
答:是的,节点可以同时读取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);
编辑:我在那里添加了一个方法来一次读取所有文件。
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');