我今天感觉自己很蠢。 我一直在查看这段代码,试图追踪它,但我就是无法弄清楚:
- 它的实际用途
- 工作原理
据我所知,第一次调用它是唯一一次 action
与 callFn
相同。因此,第一次运行时,它会创建堆栈数组。然后我就失去了它。 Action 被分配了一个函数,该函数仅将传递的回调添加到堆栈中。然后 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);
};
};
最佳答案
它不仅记住 fn
的结果,还确保一次只有一个对 fn
的有效调用。在事件调用期间提供的每个回调(当操作是第 5 行的匿名函数时)都会被推送到堆栈上,并且一旦 fn
回调堆栈(实际上是一个队列)被处理,并将结果发布到所有回调。
令人困惑的“action
被设置为callFn
或...”是基于err
条件而发生的。这个参数indicates that an error happened否则是假的。因此,当 fn
因错误回调时,堆栈将照常处理,但 action
也会重置为原始 callFn
(你记得,它在开始时也有这个值),因此后续调用将重试以从 fn
获取值。如果没有错误,action
只是设置为一个函数,该函数始终回调返回一次的 val
结果。
关于javascript - 这个内存功能是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782812/