1

代码块是

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

1 回答 1

1

从您发布的代码中,您似乎想知道为什么completed要检查arr.length两次:在replenish()传递给iterator().

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

于 2013-11-04T22:57:39.233 回答