2015-06-04 52 views
0

我正在閱讀async.js庫的源代碼,並在那裏找到了一個名爲'only_once'的函數,然後我嘗試了一些示例來清楚它是如何工作的,但是我我無法弄清楚我的例子有什麼問題,因爲他們根本就不應該這樣做。這裏是我的代碼:async.js庫中的javascript curry示例

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

only_once()當前沒有做任何事情與fn結果 - add,在這種情況下。

應該從fn提供return價值作爲自己:

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'); 
})); 
+0

哇,這真是徹底的,太感謝你了,但仍然有一兩件事,我不太明白,你怎麼可以使用在回調中傳遞的參數?因爲如果你在console.log(參數)的回調中沒有存在'return'語句,那麼它是未定義的。 – 291