async.js库中的javascript curry示例
我正在阅读async.js库的源代码,在其中我找到了一个名为“only_once”的函数,然后我尝试了一些示例来说明它是如何工作的,但我无法找出我的示例有什么问题,因为它们的行为根本不符合它们应该的方式。这是我的密码:async.js库中的javascript curry示例,javascript,currying,async.js,Javascript,Currying,Async.js,我正在阅读async.js库的源代码,在其中我找到了一个名为“only_once”的函数,然后我尝试了一些示例来说明它是如何工作的,但我无法找出我的示例有什么问题,因为它们的行为根本不符合它们应该的方式。这是我的密码: function only_once(fn) { var called = false; return function () { if (called) throw new Error('Callback was already called.'
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 ?????
only_once()
当前没有对fn
--add
的结果执行任何操作
它应该提供来自fn
的返回值作为自己的值:
return fn.apply(this, arguments);
在这方面:
// ...
return function () {
if (called) throw new Error('Callback was already called.');
called = true;
return fn.apply(this, arguments);
};
// ...
在async.js
中,没有使用返回值,因此不必提供它
该库设计用于的异步函数将接受回调函数作为参数,以便稍后调用并传递结果
只调用一次
只会阻止这些函数被多次调用:
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');
}));
哇,这真的很彻底,非常感谢你,但有一件事我还是不太明白,你怎么能在回拨中使用传递的参数?原因如果您在回调中console.log(arguments)而不存在“return”语句,则它是未定义的。
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');
}));