javascript – Node.js同步与异步

我正在学习node.js,我看到了2个同步和asycn程序的例子(同一个).

我确实理解回调的概念,但我试图理解第二个(异步)示例的好处,因为看起来他们两个做的完全相同,即使这个差异……

能否详细说明为什么第二个例子会更好?
我很乐意得到更广泛的解释,这将有助于我理解这个概念.

谢谢!!

第一个例子:

var fs = require('fs');

function calculateByteSize() {
    var totalBytes = 0,
        i,
        filenames,
        stats;
    filenames = fs.readdirSync(".");
    for (i = 0; i < filenames.length; i ++) {
        stats = fs.statSync("./" + filenames[i]);
        totalBytes += stats.size;
    }
    console.log(totalBytes);
}

calculateByteSize();

第二个例子:

var fs = require('fs');

var count = 0,
    totalBytes = 0;

function calculateByteSize() {
    fs.readdir(".", function (err, filenames) {
        var i;
        count = filenames.length;

        for (i = 0; i < filenames.length; i++) {
            fs.stat("./" + filenames[i], function (err, stats) {
                totalBytes += stats.size;
                count--;
                if (count === 0) {
                    console.log(totalBytes);
                }
            });
        }
    });
}

calculateByteSize();

解决方法:

您的第一个示例是阻止I / O.换句话说,在循环遍历每个文件之前,您需要等待readdir操作完成.然后,您需要阻止(等待)每个单独的sync stat操作才能运行,然后再转到下一个文件.在calculateByteSize()调用之后,没有代码可以运行,直到所有操作都完成.

另一方面,async(第二个)示例是使用回调模式的所有非阻塞.这里,只要调用fs.readdir(但在运行回调之前),执行就会在calculateByteSize()调用之后返回. readdir任务完成后,它会对您的匿名函数执行回调.在这里,它循环遍历每个文件,并再次对fs.stat进行非阻塞调用.

第二个更有利.如果您可以假装对readdir或stat的调用可以在250ms到750ms之间完成(可能不是这种情况),那么您将等待对同步操作的串行调用.但是,异步操作不会导致您在每次调用之间等待.换句话说,循环读取readdir文件,如果同步执行,则需要等待每个stat操作完成.如果您要异步执行此操作,则无需等待调用每个fs.stat调用.

上一篇:javascript for循环中的异步进程


下一篇:android – 如何解决FATAL EXCEPTION java.lang.RuntimeException:执行doInBackground()时发生错误