Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.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
Jquery 为什么这个回调函数不会导致竞争条件?_Jquery_Node.js_Callback - Fatal编程技术网

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

Jquery 为什么这个回调函数不会导致竞争条件?,jquery,node.js,callback,Jquery,Node.js,Callback,我不明白为什么下面的代码不会导致潜在的竞争条件。看起来count和totalBytes是可以被多个回调函数访问的变量,我觉得count--和totalBytes+=stats.size可能会引起竞速,因为你不能保证传递给fs.stat()的回调函数的顺序(因为这是一个IO操作) var fs=require('fs'); 变量计数=0, totalBytes=0; 函数calculateByteSize(){ fs.readdir(“.”),函数(错误,文件名){ var i; count=fi

我不明白为什么下面的代码不会导致潜在的竞争条件。看起来
count
totalBytes
是可以被多个回调函数访问的变量,我觉得
count--
totalBytes+=stats.size
可能会引起竞速,因为你不能保证传递给
fs.stat()
的回调函数的顺序(因为这是一个IO操作)

var fs=require('fs');
变量计数=0,
totalBytes=0;
函数calculateByteSize(){
fs.readdir(“.”),函数(错误,文件名){
var i;
count=filenames.length;
对于(i=0;i
Javascript只有一个线程,因此一次只能有一个回调修改
计数。但是,回调的顺序不能保证。

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

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

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

为什么回调的顺序会影响结果?你所做的就是加减法。就像你改变了你在数学方程式中加入的数值一样,你仍然会得到相同的结果。你说的赛车是什么意思?count是目录中的一个常量,与@adam0101注释完全一致。你需要解释一下,你的代码片段是什么意思。不管回调的方式如何,最终结果都是一样的。根据J Morris的回答,我猜chen认为JS支持多线程,但如果我错了,请chen纠正我。为什么回调的顺序会影响结果?你所做的就是加减法。就像你改变了你在数学方程式中加入的数值一样,你仍然会得到相同的结果。你说的赛车是什么意思?count是目录中的一个常量,与@adam0101注释完全一致。你需要解释一下,你的代码片段是什么意思。不管回调的方式如何,最终结果都是一样的。根据J Morris的回答,我猜chen认为JS支持多线程,但如果我错了,请chen纠正我。嗯,显然web workers可以是多线程的,所以这可能取决于代码的执行方式@adam0101-但即使这段代码是在一个webWorker中,它也是在一个webWorker中,每个webWorker只有一个JS线程,所以仍然没有争用条件。这是nodejs代码,nodejs中没有webWorkers。嗯,显然webWorkers可以是多线程的,所以这可能取决于代码的执行方式@adam0101-但即使这段代码是在一个webWorker中,它也是在一个webWorker中,每个webWorker只有一个JS线程,所以仍然没有争用条件。这是nodejs代码,nodejs中没有webworker。
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();