javascript - Node.js 同步与异步

标签 javascript node.js asynchronous synchronization

我目前正在学习 node.js,我看到了 2 个同步和异步程序示例(同一个)。

我确实了解回调的概念,但我试图了解第二个(异步)示例的好处,因为即使存在这种差异,他们两个似乎也在做完全相同的事情......

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

谢谢!!

第一个例子:

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 操作完成后才能遍历每个文件。然后,您需要阻止(等待)每个单独的同步统计操作运行,然后再转到下一个文件。 calculateByteSize() 调用后,在所有操作完成之前,没有代码可以运行。

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

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

关于javascript - Node.js 同步与异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659116/

相关文章:

JavaScript/XPath 错误

javascript - 检查变量是否(已定义)在 JavaScript 中不起作用

node.js - 这个 ejs 在 jade 中会是什么样子?

c# - Linq 和异步 Lambda

GWT (2.4.0) + XSRF

javascript - 变量内的 if 语句

javascript - 如何从 WebURL 获取地理位置

javascript - Node.js - child_process.exec 和输出重定向

javascript - 在带有 express 的 node.js 中使用 express.static(__dirname) 函数时重定向到错误的 html 页面

javascript - 使 Meteor.methods 同步和异步