【问题标题】:async memoized - understanding source codeasync memoized - 理解源代码
【发布时间】:2012-08-17 09:45:14
【问题描述】:

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

【问题讨论】:

    标签: javascript memoization async.js


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,为什么要这样做 args.concat( [function() {...} ] ) ?很难读这个
    • 我并没有声称理解整个函数试图完成什么(它是非常迟钝的代码,没有 cmets),但它之前已经从参数中弹出回调,所以它把这个匿名函数(在一个数组中)回到参数数组的末尾。它将最终调用回调并将此参数数组传递给它,因此回调必须预期这种类型的结构。
    • 我不明白 else 块是否也记录错误结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2019-02-03
    • 2012-01-22
    相关资源
    最近更新 更多