我今天感觉非常愚蠢。 我一直在看这段代码,试图追踪它,但我无法弄清楚:
据我所知,第一次被称为action
与callFn
相同的时间。因此,它第一次运行时会创建堆栈数组。然后我失去了它。操作被分配一个函数,只是将传递的回调添加到堆栈。然后fn 实际被调用,并根据其结果,“action”被设置为callFn(?!?)或调用回调的函数...然后,所有调用堆栈被称为。
我讨厌迷失在代码中,但这有点超出我的意义。任何比我聪明的人能够“得到它”吗?
var memoize = function(fn) {
var callFn = function(callback) {
var stack = [callback];
action = function(callback) {
stack.push(callback);
};
fn(function(err, val) {
action = err ? callFn : function(callback) {
callback(null, val);
};
while (stack.length) stack.shift()(err, val);
});
};
var action = callFn;
return function(callback) {
action(callback);
};
};
答案 0 :(得分:1)
它不仅会记住fn
的结果,而且还确保每次只有一个fn
的有效呼叫。在活动调用期间提供的每个callback
(当action
是来自第5行的anon函数时)被推送到堆栈上,并且一旦fn
回调堆栈(它实际上是一个队列)处理并将结果发布到所有回调。
令人困惑的“ action
设置为callFn
或...... ”基于err
条件发生。此参数indicates that an error happened,否则为假。因此,当fn
回调错误时,堆栈会照常处理,而action
重置也会原始callFn
(你记得,它有此值也在开头,因此后续调用将重试以从fn
获取值。如果没有错误,action
只会设置为一个函数,该函数始终回调一次返回的结果val
。
答案 1 :(得分:0)
Memoization是一种使用副作用来改进-at runtime - 函数性能而不改变其行为的技术。粗略地说,您可以通过存储先前调用中返回的函数值来执行memoization,并在对函数的进一步调用中返回这些值,而不是实际调用函数。