2012-08-22 31 views
2

async.memoize(),這個函數中的註釋之後的最後一個else塊是幹什麼的?async memoized - 理解源代碼

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

回答

1

如果key沒有在無論是memoqueues對象(if聲明的前兩個部分),然後調用回調和回調指派返回值發現到queues[key]作爲一個元素數組。

然後,它調用queue[key]數組中的任何函數。

+0

謝謝,它爲什麼做args.concat([function(){...}])?難以閱讀這一個 – portoalet

+0

我並沒有聲稱理解整體函數試圖完成什麼(這是相當鈍的代碼,沒有評論),但它之前已經從參數中彈出回調,因此它將這個匿名函數(在一個數組)返回到參數數組的末尾。它將最終調用回調函數並將它傳遞給參數數組,所以回調函數必須預期這種類型的結構。 – jfriend00

+0

我不明白,如果它還阻止也記憶錯誤結果。 –