node.js如何使用单个进程实现异步回调

时间:2013-07-30 16:20:36

标签: node.js asynchronous readfile

我不知道节点如何实现其惊人的想法。我在使用它时有一个问题 我必须阅读四个文件 file1.js file2.js file3.js file4.js 并将它们连成一个大的javascript文件 result.js 。保持秩序很重要。

因此,使用 readFileSync 代替 readFile 是正常的。
我知道这是一个糟糕的解决方案。有人有个好主意吗?

问: node.js是否可以同时读取四个文件?

希望有人能解释node.js的原理以及何时触发process.nextTick。

1 个答案:

答案 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');