异步记忆-理解源代码

async memoized - understanding source code

本文关键字:源代码 记忆 异步      更新时间:2023-09-26

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;
};

如果在memoqueues对象(if语句的前两部分)中都找不到key,则它会调用回调,并将回调的返回值作为一个单元素数组分配给queues[key]

然后,它调用queue[key]数组中的任何函数。