2

からasync.memoize()、この関数のコメントの後の最後のelseブロックは何をしますか?

https://github.com/caolan/async/blob/master/lib/async.js#L671

async.memoize = function (fn, hasher) {
    var memo = {};
    var queues = {};
    hasher = hasher || function (x) {
        return x;
    };
    var memoized = function () {
        var args = Array.prototype.slice.call(arguments);
        var callback = args.pop();
        var key = hasher.apply(null, args);
        if (key in memo) {
            callback.apply(null, memo[key]);
        }
        else if (key in queues) {
            queues[key].push(callback);
        }
        else {
            // what does this else block do?
            queues[key] = [callback];
            fn.apply(null, args.concat([function () {
                memo[key] = arguments;
                var q = queues[key];
                delete queues[key];
                for (var i = 0, l = q.length; i < l; i++) {
                  q[i].apply(null, arguments);
                }
            }]));
        }
    };
    memoized.unmemoized = fn;
    return memoized;
};
4

1 に答える 1

1

またはオブジェクト(ステートメントの最初の2つの部分)のkeyいずれにもが見つからない場合は、コールバックを呼び出し、コールバックからの戻り値を1つの要素配列として割り当てます。memoqueuesifqueues[key]

次に、queue[key]配列内の任意の関数を呼び出します。

于 2012-08-22T01:29:54.240 に答える