Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js如何实现单进程异步回调_Node.js_Asynchronous_Readfile - Fatal编程技术网

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

node.js如何实现单进程异步回调,node.js,asynchronous,readfile,Node.js,Asynchronous,Readfile,我不知道node是如何实现其惊人的想法的。当我使用它时,我有一个问题。 我必须读取四个文件file1.js file2.js file3.js file4.js,并将它们合并成一个大的javascript文件result.js。保持他们的秩序很重要 因此,我通常使用readFileSync而不是readFile 我知道这是个糟糕的解决方案。有人有这样做的好主意吗 Q:node.js是否可以同时读取四个文件 希望有人能解释node.js的原理以及process.nextTick何时被触发。A:是的

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

因此,我通常使用readFileSync而不是readFile
我知道这是个糟糕的解决方案。有人有这样做的好主意吗

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


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

A:是的,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);
例2:


答:是的,节点可以同时读取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);
例2:


我同意,顺序模式是最好的方法。谢谢你,这是非常正确的。节点可以同时读取文件。但我还是不知道为什么。我曾经认为节点可以同时读取文件和处理网络请求,但不能读取两个文件。是否有一些关于node是如何做到这一点的信息?从脚本的角度来看,node不是线程化的。但是,节点在V8后端上运行。V8后端如何处理并发性是我们不必担心的实现细节。但它可以包括生成进程、启动线程、外部运行系统命令等,只要它符合javascript规范。我同意,顺序模式是最好的方法。谢谢你,这是非常正确的。节点可以同时读取文件。但我还是不知道为什么。我曾经认为节点可以同时读取文件和处理网络请求,但不能读取两个文件。是否有一些关于node是如何做到这一点的信息?从脚本的角度来看,node不是线程化的。但是,节点在V8后端上运行。V8后端如何处理并发性是我们不必担心的实现细节。但只要遵循javascript规范,它可以包括生成进程、启动线程、外部运行系统命令等。
process.nextTick(function() {
        console.log('printed last');
});

console.log('printed first');