async.js库

时间:2015-06-04 20:42:49

标签: 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.');
        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 ?????

1 个答案:

答案 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');
}));