Javascript 什么';async.js中第169行和第171行之间的代码块是什么意思?

Javascript 什么';async.js中第169行和第171行之间的代码块是什么意思?,javascript,async.js,Javascript,Async.js,代码块是 if (completed >= arr.length) { return callback(); } 它位于函数的每个限制中 我的想法是,由于JavaScript是单线程的,所以迭代器函数的参数列表中的回调函数一次只能执行一次,所以完成的变量不能被两个回调函数同时修改。如果是这样,当调用回调函数时,它将每次检查已完成的变量,以便结束while循环 上面的代码块似乎是多余的,那么代码块有什么用呢 谢谢你回答我的问题 整个功能如下: var _eachLimit = fun

代码块是

if (completed >= arr.length) {
   return callback();
}
它位于函数的每个限制中

我的想法是,由于JavaScript是单线程的,所以迭代器函数的参数列表中的回调函数一次只能执行一次,所以完成的变量不能被两个回调函数同时修改。如果是这样,当调用回调函数时,它将每次检查已完成的变量,以便结束while循环

上面的代码块似乎是多余的,那么代码块有什么用呢

谢谢你回答我的问题

整个功能如下:

var _eachLimit = function (limit) {

    return function (arr, iterator, callback) {
        callback = callback || function () {};
        if (!arr.length || limit <= 0) {
            return callback();
        }
        var completed = 0;
        var started = 0;
        var running = 0;

        (function replenish () {
            if (completed >= arr.length) {
                return callback();
            }

            while (running < limit && started < arr.length) {
                started += 1;
                running += 1;
                iterator(arr[started - 1], function (err) {
                    if (err) {
                        callback(err);
                        callback = function () {};
                    }
                    else {
                        completed += 1;
                        running -= 1;
                        if (completed >= arr.length) {
                            callback();
                        }
                        else {
                            replenish();
                        }
                    }
                });
            }
        })();
    };
};
var\u eachLimit=函数(限制){
返回函数(arr、迭代器、回调){
callback=callback | |函数(){};
如果(!arr.length | | limit=arr.length){
返回回调();
}
运行时(运行<限制和启动=arr.length){
回调();
}
否则{
补充();
}
}
});
}
})();
};
};

从您发布的代码中,您似乎想知道为什么会根据
arr.length
检查
completed
两次:一次是在
refund()
的开头,另一次是从传递给
iterator()
的回调函数


Javascript实际上是单线程的(在浏览器中)(到目前为止),但是
iterator()
是异步的。它将立即返回并在一段时间后调用提供的回调函数,到那时,
completed
和/或
arr.length
可能已更改,即使单个线程已运行,因此确实需要再次检查。

从您发布的代码中,您似乎想知道为什么要根据
arr.length
检查
completed
两次:都是在
infull()
的开头,也都是从传递给
iterator()的回调函数中检查


Javascript实际上是单线程的(在浏览器中)(到目前为止),但是
iterator()
是异步的。它将立即返回并在一段时间后调用提供的回调函数,到那时,
completed
和/或
arr.length
可能已更改,即使单个线程已运行,因此确实需要进行另一次检查。

可能是递归函数?我不知道,用这么少的代码是不可能分辨出来的;)@NiettheDarkAbsol确实是递归的,请看这里:@L:157。kg8gk,我看不到冗余。你能解释清楚一点吗?也许我误解了你的意思。如果没有那段代码,它怎么知道它已经完成了呢?为什么你这么问,而不是这段代码的维护者?他们最清楚。@iccthedral,
infull()
不是递归的,从异步回调调用自己不会积累堆栈空间<代码>补充()
从传递到
迭代器()
的回调调用自身,该回调似乎是异步的,因此堆栈将是干净的。可能是递归函数?我不知道,用这么少的代码是不可能分辨出来的;)@NiettheDarkAbsol确实是递归的,请看这里:@L:157。kg8gk,我看不到冗余。你能解释清楚一点吗?也许我误解了你的意思。如果没有那段代码,它怎么知道它已经完成了呢?为什么你这么问,而不是这段代码的维护者?他们最清楚。@iccthedral,
infull()
不是递归的,从异步回调调用自己不会积累堆栈空间<代码>补充()从传递给
迭代器()
的回调调用自身,这似乎是异步的,因此堆栈将是干净的。假设迭代器中的异步操作结束,迭代器调用回调(迭代器的第二个参数),它返回javascript环境,单线程。在我看来,一个接一个的回调,如果是这样,那么变量completed将不会被其他回调更改,因为一次只能执行一个回调…我现在对代码块感到头晕。T@kg8gk,我想我不理解你的评论。我回答的要点是,
completed
在第一次签入
infull()
和调用回调之间可能发生了变化。您的注释中的回调、迭代器的第二个参数或返回函数的回调(它的第三个参数)是什么意思?如果是前一个,我觉得没关系,因为
completed
只能在回调中更改,没有错误,每次执行进入回调中的第一个
else
子句时都会检查它。下面是我对该过程的一个想法。假设迭代器中的异步操作结束,迭代器调用回调(迭代器的第二个参数),它返回到javascript环境,单螺纹。在我看来,一个接一个的回调,如果是这样,那么变量completed将不会被其他回调更改,因为一次只能执行一个回调…我现在对代码块感到头晕。T@kg8gk,我想我不理解你的评论。我回答的要点是,
completed
在第一次签入
infull()
和callbac