为什么这个回调函数不会导致竞争条件?

时间:2017-06-14 17:37:55

标签: jquery node.js callback

我不明白为什么以下代码不会导致潜在的竞争条件。看起来counttotalBytes是可以通过多个回调函数访问的变量,我觉得count--totalBytes += stats.size可能导致比赛,因为您无法保证回调函数的订单传递给fs.stat()(因为它是一个IO操作)。

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();

2 个答案:

答案 0 :(得分:4)

Javascript只有一个线程,因此一次只能有一个回调修改count。但是,无法保证回调顺序。

答案 1 :(得分:0)

如果您已达到异步函数计数,则可以,这里存在争用情况。但是您的函数是同步的,这意味着您的函数是原子的。由于这个原因,这里没有比赛条件。如果您在此处使用了异步功能,尽管有单线程,但由于事件循环中的上下文切换,因此发生了竞态条件。