代码块是
if (completed >= arr.length) {
return callback();
}
它位于_eachLimit函数中。
我的想法是,由于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();
}
}
});
}
})();
};
};
答案 0 :(得分:1)
从您发布的代码中,您似乎想知道为什么completed
针对arr.length
进行了两次检查:replenish()
的开头和传递给{{的回调函数1}}。
Javascript确实是单线程的(在浏览器中)(到目前为止),但iterator()
是异步。它将立即返回并在稍后调用提供的回调函数,到那时iterator()
和/或completed
可能已经更改,即使单个线程已运行,所以确实有必要进行另一次检查。