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

标签 node.js asynchronous readfile

我不知道node是如何实现它的惊人想法的。我在使用它时有一个问题。
我必须读取四个文件 file1.js file2.js file3.js file4.js 并将它们连接到一个大的 javascript 文件 result.js 。维持他们的秩序很重要。

所以我使用readFileSync而不是readFile是正常的。
我知道这是一个糟糕的解决方案。有人有这样做的好主意吗?

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

希望有人能解释一下node.js的原理以及process.nextTick什么时候会被触发。

最佳答案

答:是的, Node 可以同时读取 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 只是在事件循环的下一次处理此函数。例如:

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

while(true);

例如 2:

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

console.log('printed first');

关于node.js - Node.js 如何使用单进程实现异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17952335/

相关文章:

node.js - 在 nodejs 中重用 postgresql 连接池

node.js - TypeScript + Node.js 文件系统问题

javascript - mysql查询时异步 waterfall 不遵循顺序

c - 逐行读取数字并将其拆分为 C 中的多个变量

javascript - TS2307 : Cannot find module '~express/lib/express'

ruby - 是否有处理跨框架身份验证的标准方法?

c# - 使用 Task.Delay() 的成本是多少?

mongodb - 从数据库按时间间隔调度任务的最佳方法

python - 在Python中读取SPSS(.sav)文件时出现 "title already used as a name or title"错误

Java代码读取带有无法识别标志的文件