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;
};
謝謝,它爲什麼做args.concat([function(){...}])?難以閱讀這一個 – portoalet
我並沒有聲稱理解整體函數試圖完成什麼(這是相當鈍的代碼,沒有評論),但它之前已經從參數中彈出回調,因此它將這個匿名函數(在一個數組)返回到參數數組的末尾。它將最終調用回調函數並將它傳遞給參數數組,所以回調函數必須預期這種類型的結構。 – jfriend00
我不明白,如果它還阻止也記憶錯誤結果。 –