我正在阅读async.js库的源代码,并在其中找到了一个名为' only_once'然后我尝试了一些例子来说明它是如何工作的,但我无法弄清楚我的例子出了什么问题,因为他们根本不按照应有的方式行事。这是我的代码:
function only_once(fn) {
var called = false;
return function () {
if (called) throw new Error('Callback was already called.');
called = true;
fn.apply(this, arguments);
};
}
// my example code
var add = function (a, b) { return a + b; };
var add_once = only_once(add);
var a = add_once(1, 3);
console.log(a); // this prints undefined not 4, what the hell ?????
答案 0 :(得分:0)
only_once()
目前没有对fn
- add
的结果做任何事情。
它应该提供return
fn
作为自己的值:
return fn.apply(this, arguments);
// vs.
fn.apply(this, arguments);
在上下文中:
// ...
return function () {
if (called) throw new Error('Callback was already called.');
called = true;
return fn.apply(this, arguments);
};
// ...
在async.js
内,return
值未被使用,因此无需提供。
库设计的异步函数接受回调函数作为稍后调用的参数并传递结果。
only_once
只是阻止多次调用它们:
function asyncFunc(callback) {
setTimeout(callback, 100); // callback invoked
setTimeout(callback, 200); // Uncaught Error: Callback was already called.
}
asyncFunc(only_once(function (value) {
console.log('callback invoked');
}));