Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
async.js库中的javascript curry示例_Javascript_Currying_Async.js - Fatal编程技术网

async.js库中的javascript curry示例

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.'

我正在阅读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 ?????
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');
}));