gpt4 book ai didi

javascript - async.js 中第 169 行和第 171 行之间的代码块的含义是什么?

转载 作者:行者123 更新时间:2023-11-28 01:50:16 24 4
gpt4 key购买 nike

代码块是

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

它位于函数 _eachLimit 中。

我的想法是,由于JavaScript是单线程的,迭代器函数参数列表中的回调函数一次只能执行一次,因此不能出现completed变量的情况由两个回调函数同时修改。如果是这样,当调用回调函数时,它每次都会检查 completed 变量,以便结束 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();
}
}
});
}
})();
};
};

最佳答案

从您发布的代码来看,您似乎想知道为什么 completed 对照 arr.length 检查两次:两次都在 replenish() 的开头 以及传递给 iterator() 的回调函数。

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

关于javascript - async.js 中第 169 行和第 171 行之间的代码块的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19778567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com